c++ - 从指向基类的指针调用派生类的复制构造?

标签 c++ pointers inheritance copy-constructor dynamic-allocation

我有

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/

相关文章:

c# - ASP.NET 核心 2 : What could be the code behind a "many-to-one" relationship in this case?

c++ - 读取 BSDF 数据格式

c++ - 尝试对数组进行排序

c++ - 访问文件中的单个字符效率低下? (C++)

C++:将值(指向)设置为 0 有什么作用?

c++ - 为什么这个来自模板类型 "stack"类的 isEmpty() 没有继承到 C++ 中模板类型的派生类 "specialStack"?

c++ - 在 Windows 上以编程方式获取每个进程的磁盘 io 统计信息?

java - "NewStringUTF"是指向函数的指针吗?或功能?

c - 使用 malloc 时如何正确使用 free() 来释放内存?

c++ - 类多态性和相等运算符