当我有一个指向其基类的指针时克隆一个对象?

时间:2016-08-15 07:47:02

标签: c++ pointers object inheritance

我有多个类(比方说B和C),它继承了一些抽象基类(让我们说A)。我有一个指向(A)的指针(p1),它实际指向类B或类C的对象(o1)。然后我有另一个指针(p2)到A类,我想让它指向另一个对象( o2)与o1相同。问题是,那时我不知道o1的类型是什么。

A* newObject() //returns pointer to A which actually points to an object of class B or class C
{
     ....
}
A * p1 = newObject();
A * p2 = //I want it to point to a new object that is the same as the object p1 is pointing to. How can I do that?

我需要这个,因为我正在实现一个遗传算法,我有多种类型的控制类,然后我想要变异。当某些东西复制时,我希望孩子和父母一样,然后我想让孩子变异。这意味着p2不能等于p1,因为这样也会改变父节点的控制器。

1 个答案:

答案 0 :(得分:4)

将虚拟方法Clone()添加到班级。

class A {
public:
    virtual ~A() = default;

    auto Clone() const { return std::unique_ptr<A>{DoClone()}; }
    // ...
private:
    virtual A* DoClone() const { return new A(*this); }
};

class B : public A {
public:
    auto Clone() const { return std::unique_ptr<B>{DoClone()}; }
    // ...
private:
    // Use covariant return type :)
    B* DoClone() const override { return new B(*this); }
    // ...
};

class C : public A {
public:
    auto Clone() const { return std::unique_ptr<C>{DoClone()}; }
    // ...
private:
    // Use covariant return type :)
    C* DoClone() const override { return new C(*this); }
    // ...
};

然后

auto p2 = p1->Clone();