繁体   English   中英

从指向基类的指针调用派生类的副本构造?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM