我试图抓住继承和Deep Copy,但我遇到了一些麻烦。 我有3个类(1个Base和2个Derived),如下所示:
class Base {
protected:
int id;
public:
Base(int i) : id(i) {};
virtual ~Base();
};
class DeriveA : public Base {
int specialID;
public:
DeriveA(int s, int i) : Base(i), specialID(s) {};
~DeriveA();
};
class DeriveB : public Base {
int specialID;
public:
DeriveB(int s, int i) : Base(i), specialID(s) {};
~DeriveB();
};
在我的主要上我有这样的事情:
int main() {
Base **Array;
int i, n;
Array = new Base*[5];
for (i = 0 ; i < 5 ; i++) {
n = rand() % 2;
if (n)
Array[i] = new DeriveA(i, n);
else
Array[i] = new DeriveB(i, n);
}
}
如果满足特定情况,我想将数组对象硬复制到其他对象上。我发现很难为它制作一个复制构造函数,因为Array[0] = Array[2];
对我来说不起作用。我不想使用任何矢量或std :: copy,因为那不是我的&#34;教育&#34;目标
PS 1:为此,赋值运算符更好,因为我已经初始化了数组的所有对象。
PS 2:由于它是通用代码,因此我遗漏了一些错误。请忽略它们并专注于这个问题。
答案 0 :(得分:3)
首先,您应该分配Base*
数组:
Array = new Base*[5];
这就是初始化元素指针的方法:
Array[i] = new DeriveA(i,n);
不喜欢这样:
// * added for further clarification, otherwise invalid and rejected at compilation
*Array[i] = DeriveA(i,n);
因为那是:
请注意,您的Base
为missing a virtual
destructor。
然后当然是释放...你可以找到如何做到here。
答案 1 :(得分:2)
如果要克隆对象,而不是将指针复制到同一对象,则可以使用虚拟克隆函数:
class Base {
public:
virtual Base* clone() const = 0;
virtual ~Base(); // Don't forget 'virtual' here
};
class DeriveA : public Base {
public:
virtual Base* clone() const { return new DeriveA(*this); }
};
class DeriveB : public Base {
public:
virtual Base* clone() const { return new DeriveB(*this); }
};
// ...
Array[0] = Array[2]->clone();