簡體   English   中英

抽象類和繼承問題

[英]issue with abstract classes and inheritence

假設我有那兩個班:

class num{
public:
    int a;
    num(){};
    num(int x):a(x){};
    num(const num& n):a(n.a){}
    virtual bool operator==(const num& n)const = 0;
    virtual ~num(){};
};

class tmp: public num{
public:
    tmp(){};
    tmp(int x):num(x){};
    tmp(const num& n): num(n){}
    tmp(const tmp& t): num(t.a){}
    virtual bool operator==(const num& n)const{
        return tmp(n).a == a;
    }
    virtual ~tmp(){};
};

在main中是這樣的:

int main() {
    num* x = &get(...);

    return 0;
}

get返回類型為tmp的引用(在這種情況下,通常返回對繼承自num的類型的引用),我要執行的操作是創建另一個num* y ,它指向*x副本 ,以便在更改時*y我不會改變*x 由於num是抽象的,所以我不太清楚該怎么做,因此我無法創建此類型的對象來進行復制。

好,另一個問題。 如果我重載<<運算符:

    std::ostream& operator<<(std::ostream& os, const tmp& t){
        return os<<t.a<<endl;
    }

然后嘗試執行以下操作:

cout<<*x<<endl;

我收到no match for 'operator<<'的錯誤no match for 'operator<<'為什么呢?

您正在尋找原型模式 ,通常也稱為克隆模式

這基本上是一種純虛擬方法

virtual std::unique_ptr<num> clone() const = 0;

...您在num聲明,將被每個派生類覆蓋。 然后,您只需調用x->clone(); 獲得正確類型的全新對象。

您將需要一個虛擬函數來根據對象的動態類型克隆對象。 它必須返回(最好是智能的)指向正確分配的新分配對象的指針。 例如:

class num {
public:
    virtual std::unique_ptr<num> clone() const = 0;
    // other members...
};

class my_num : public num {
public:
    virtual std::unique_ptr<num> clone() const {
        return std::make_unique<my_num>(*this);
    }
    // other members...
};

int main() {
    num* x = &get(...);
    auto y = x->clone();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM