指向对象的向量向量,需要向量的深层副本,但对象是继承对象的基础

时间:2010-11-24 12:21:46

标签: c++ multiple-inheritance copy-constructor

我想要一个带有指向对象指针的向量的深层副本,但是对象可以是C或B.我知道这会让人感到困惑(我解释它的方式),让我来说明一下。

class A {
    A(const A& copyme) { }
    void UnableToInstantiateMeBecauseOf() =0;
};

class B {
    B(const B& copyme) : A(copyme) {}
};

class C {
    C(const C& copyme) : A(copyme) {}
};

std::vector<A*>* CreateDeepCopy(std::vector<A*>& list)
{
    std::vector<A*>* outList = new std::vector<A*>();

    for (std::vector<A*>::iterator it = list.begin(); it != list.end(); ++it)
    {
        A* current = *it;
        // I want an copy of A, but it really is either an B or an C
        A* copy = magic with current;
        outList->push_back(copy);
    }

    return outList;
}

如何创建一个对象的副本,而不是它继承的类型是什么?

4 个答案:

答案 0 :(得分:4)

使用克隆:

Copy object - keep polymorphism

class Super
{
public:
    Super();// regular ctor
    Super(const Super& _rhs); // copy constructor
    virtual Super* clone() const = 0; // derived classes to implement.
}; // eo class Super


class Special : public Super
{
public:
    Special() : Super() {};
    Special(const Special& _rhs) : Super(_rhs){};
    virtual Special* clone() const {return(new Special(*this));};
}; // eo class Special

编辑:

我在你的问题中注意到你的基类是抽象的。没关系,这个模型仍然有效,我已经修改过了。

答案 1 :(得分:2)

向您的类添加虚拟Clone()方法。

A* copy = it->Clone();

class A {
    virtual A* Clone()
    {
        return new A(*this);
    }
};

在派生类中覆盖克隆。实现与A类相同。

答案 2 :(得分:2)

您可以在类A中实现纯虚拟克隆功能。

答案 3 :(得分:2)

正如其他人所说,你需要某种类型的克隆机制。您可能想在Kevlin Henney的优秀论文Clone Alone中查看cloning_ptr