【问题标题】:C++ Copying objects with polymorphismC ++复制具有多态性的对象
【发布时间】:2012-09-25 07:27:04
【问题描述】:

我想在 C++ 中复制对象。问题是我有具有多态性的派生类,如下面的伪代码所示:

class BaseCl { some virtual functions };
class DerivedClass : public BaseCl { ... };

...

BaseCl * b1 = new DerivedClass();
BaseCl * b2 = new "copy of b1"; (just pseudocode)

问题出在最后一行:

我想复制“BaseCl”类的一个对象,但由于多态性,该副本必须与“DerivedClass”的原始对象一样。

最好的方法是什么?

非常感谢,感谢您的帮助。

编辑:问题已解决:

插入:

virtual BaseCl *clone() = 0;

在基类中和

DerivedCl *clone() {return new DerivedCl(*this);}

在派生类中。谢谢大家。

【问题讨论】:

标签: c++ object copy polymorphism


【解决方案1】:

您需要在 BaseC1 中定义一个用于克隆的函数。比如:

class BaseCl
{
    virtual BaseCl* clone() {return new BaseC1(*this);}
};
class DerivedClass : public BaseCl
{
    virtual BaseCl* clone() {return new DerivedClass(*this);}
};

【讨论】:

  • 您忘记输入函数的返回值。我编辑了你的答案。
  • 嗯,我遇到了另一个问题,当我尝试这个时: virtual BaseCl* clone() {return new BaseCl(*this);} BaseCl.h:45: error: cannot allocate an object of abstract type 'BaseCl' ../BaseCl.h:21: 注意:因为以下虚函数在 'BaseCl' 中是纯的:...虚函数也是问题吗?
  • 你实际上可以在派生类中有不同的返回类型,这样如果你有一个指向派生类的指针,你就不必强制转换Clone的结果。
【解决方案2】:

运行时多态性的关键是操作必须在最派生的对象中实现,因为它知道执行它们所必须知道的一切。所有基都必须公开要由基指针调用的虚函数。

您可以在基层定义一个虚拟的BaseCl* clone() 函数,并将您的派生类重写为return new DerivedClass(*this)

【讨论】:

    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2011-05-06
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多