我有多个类(比方说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,因为这样也会改变父节点的控制器。
答案 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();