我有
1- class A {int m;};
2- class B: public A
{float n;};
3- class C: public A
{string n;};
我将 A 类的所有实例存储在
vector <class A*> myInstansesofA;
它存储为一个指针,因为我根据一些 if 语句动态创建它们
if (some condition)
{
A* newA = new B();
myInstancesofA.push_back(newA );
}
else
{
A* newA = new C();
myInstancesofA.push_back(newA );
}
现在我需要创建 vector 的精确拷贝。使用新的指针集,但数据的精确拷贝。
问题在于将 A(实际上是 B 和 C)的每个实例的数据复制到新 vector 。
我尝试了以下但它不起作用。
for (vector<A*>::const_iterator it = myInstancesofA.begin(); it != myInstancesofA.end(); ++it)
{
A* newA = new A(*(*it));
myInstancesofA.push_back(newA );
}
我怀疑发生此错误是因为“new A”仅调用类型 A 的复制构造函数而未调用 B 或 C(我进行了调试并发现发生了这种情况)。
我该如何解决这个问题?
最佳答案
我相信您不能那样调用构造函数,并且在 C++ 中没有直接的方法来执行类似的操作(对于具有反射的语言,如 Java 和 C#,它非常简单)。
一种方法是使用 prototype pattern
class A {
public:
virtual A* clone() {
return new A {...};
}
};
class B : public A {
public:
A* clone() override {
return new B {.........};
}
};
class C : public A {
public:
A* clone() override {
return new C {.........};
}
};
对象本身负责创建自己的克隆。当然,还有很多东西需要改进设计,但至少它能让您体验到它的味道。
关于c++ - 从指向基类的指针调用派生类的复制构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30564483/