如何在 C++ 中克隆未知动态类型的对象?

How to clone objects of unknown dynamic type in C++?

我想构建一个派生的 class 对象数组。我有这个基础 class:

class CandyBox {
protected:
    string flavor;
    string origin;
public:
    inline CandyBox();
    inline CandyBox(string s1, string s2);
    virtual float getVolume() = 0;
    virtual void toString();
    CandyBox& operator=(const CandyBox& obj);
    virtual ~CandyBox() {}
};

和 2 个派生的 class 命名为 class Lindt 和 class ChocAmor 以及构造函数和方法。我正在尝试构建一个像这样的草稿列表:

CandyBox** vec = new CandyBox*[n];

for (int i = 0; i < n; i++) {
    cin >> type;
    if (strcmp(type, "ChocAmor") == 0) {
        vec[i] = new ChocAmor(1, "s", "ro");
    }
    else vec[i] = new Lindt(1, 2, 3, "f", "it");
}

我的问题是:如果我想创建另一个名为 CandyBag 的 class 并包含类似 CandyBox** vec = new CandyBox*[n]; 的属性,我需要这个方法怎么办:

CandyBag& operator=(const CandyBag& candy) {
    ChocAmor::operator=(candy);
    Lindt::operator=(candy);
    dim_max = candy.dim_max;
    current_dim = candy.current_dim;
    vec = new CandyBox*[candy.dim_max];

    for (int i = 0; i <= current_dim; i++) {
        vec[i] = new ; //HERE I'M STUCK
        // because I can't just simply write vec[i] = candy.vec[i], right?
        // I need to allocate memory for that vec[i] first
    }
    return *this;
}

如果我不知道类型(如果它是 ChocAmor 对象或 Lindt 类型,我不确定如何为 vec[i] 分配内存candy.vec[i])。我应该得到一个辅助数组来存储该数组的类型吗?

所有指向 class 类型的指针都具有相同的大小和表示形式。这对于不透明指针的工作至关重要。

如果要启用对指向对象的克隆,请在接口中添加一个虚拟.clone(),and/or编写您自己的复制智能指针。 拖着指向克隆函数的指针或维护从 typeid 到克隆函数的映射会更加麻烦,但在其他情况下可能是正确的解决方案。

否则我有一个建议:

使用智能指针(最好 std::unique_ptr)和标准容器(最好 std::vector)以避免手动内存管理并获得使用标准类型的所有相关好处。