[英]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.