[英]Invoke the copy construction of a derived class from a pointer to the base class?
我有
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 );
}
现在,我需要创建向量的精确副本。 使用一组新的指针,但数据的精确副本。
问题在于将每个A实例(实际上是B和C)的数据复制到新向量中。
我尝试了以下操作,但不起作用。
for (vector<A*>::const_iterator it = myInstancesofA.begin(); it != myInstancesofA.end(); ++it)
{
A* newA = new A(*(*it));
myInstancesofA.push_back(newA );
}
我怀疑发生此错误是因为“新A”仅调用类型A的副本构造函数,而不调用B或C(我调试并发现这种情况)。
我该如何解决?
我相信您不能像那样调用构造函数,并且在C ++中没有做类似事情的简单方法(对于使用Reflection的语言,例如Java和C#,这是非常简单的)。
一种方法是利用原型模式
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 {.........};
}
};
对象本身负责创建其自身的副本。 当然,在设计上还有更多需要改进的地方,但至少可以使您体会到它的味道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.