[英]C++ constructor copy of an array of derived classes
盡管在復制構造函數中有許多帶有管理指針的文章,但我沒有找到合適的答案來正確實現以下內容。
類A的對象“ a”存儲元素的“制表符”數組,這些數組是指向類B1或B2的元素的指針,均從類B派生。
我想通過調用副本構造函數來保存“ a”的副本(以便稍后還原)。 我的問題是在此副本構造函數中分配內存,以復制'tab [i]'元素的內容。
必須有一種規范的方法(我想無需調用<dynamic_cast>來確定它是B1還是B2類型)。
這是我用來說明問題的MWE:
#include <iostream>
using namespace std;
//-----------------------
class B {
public:
virtual void display()=0;
};
//-----------------------
class B1 : public B {
public:
B1() : val(1) // ctor
{}
void display() {
cout << val << endl;
}
private:
int val;
};
//-----------------------
class B2 : public B {
public:
B2() : val(2) // ctor
{}
void display() {
cout << val << endl;
}
private:
int val;
};
//---------- A -------------
class A {
public:
A () { // ctor
tab = new B * [2];
tab[0] = new B1;
tab[1] = new B2;
}
A (A const &orig) // copy ctor
: tab(orig.tab)
{
// ... HOW should i make a copy of the tab[i] elements ?...
// ... as i do not know if tab[i] is type B1 or B2 ...
}
void display() {
tab[0]->display();
tab[1]->display();
}
private:
B ** tab;
};
//------M A I N ---------
int main() {
A a;
a.display();
return 0;
}
您不能通過使用dynamic_cast
或調用虛擬方法(然后將其分派到具體類型)來確定B的具體類型,而不執行此操作。
通常可以通過在B
接口上使用“克隆”模式來解決此問題,並將函數添加到B
: virtual B* clone() const = 0;
每個實現都分配並返回其自身的適當副本。
還要注意,您沒有刪除示例中分配的任何內存。 記住要在析構函數中執行此操作,或者最好使用智能指針(如std :: unique_ptr)!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.