2014-09-12 47 views
0

假設我有這2類:問題與抽象類和的傳承

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(){}; 
}; 

和像這樣在主:

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<<' 這是爲什麼?

+0

只需使用'tmp'的複製構造函數? – Quentin 2014-09-12 13:30:03

+0

我正在使用'num *',因爲我不知道'get'返回了什麼。它可以是'tmp'或其他一些從'num'繼承的類型。所以我不能使用特定的拷貝構造函數 – littlerunaway 2014-09-12 13:31:59

+0

當然。腦呃逆。 – Quentin 2014-09-12 13:38:45

回答

1

您在查找prototype pattern,也有可能被稱爲克隆模式

這基本上是一個純虛方法

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

...您在num聲明,由各派生類中重寫。然後,您只需撥打x->clone();即可獲得正確類型的全新對象。

+0

好吧,我想我明白你的意思了。感謝名單 – littlerunaway 2014-09-12 13:44:24

1

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

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(); 
}