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

Posted

技术标签:

【中文标题】当我有一个指向其基类的指针时克隆一个对象?【英文标题】:Clone an object when I have a pointer to its base class? 【发布时间】:2016-08-15 07:47:02 【问题描述】:

我有多个类(比如 B 和 C),它们继承了一些抽象基类(比如 A)。我有一个指向A类的指针(p1),它实际上指向B类或C类的对象(o1)。然后我有另一个指向A类的指针(p2),我想让它指向另一个对象( 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】:

在类中添加虚方法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();

【讨论】:

A 类是抽象的,所以我不认为new A(*this) 是有效的,否则谢谢。 所以virtual A* DoClone() const = 0. 这两个版本(您第一次发布的版本和使用 DoClone 的版本)之间有什么区别?还需要auto 不是编译时完成的,所以使用auto 没有帮助吗? @indjev99:我使用DoClone 只公开std::unique_ptr,而不是原始的拥有指针。如果您愿意,auto 可以替换为 std::unique_ptr&lt;..&gt;

以上是关于当我有一个指向其基类的指针时克隆一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

是否可以使用其基类构造函数创建派生类的指针而不修改派生类的布局?

如果继承类型受到保护,我可以使基类的指针指向派生对象吗? [复制]

删除指向子类的指针会调用基类析构函数吗?

关于C++基类、派生类的引用和指针

return this 和return * this