在C++中复制多态对象

dor*_*ron 35 c++ clone

我有Base派生的基类Derived1,Derived2Derived3.

我为其中一个派生类构建了一个实例,我将其存储为Base* a.我现在需要制作一个我将存储的对象的深层副本Base* b.

据我所知,复制类的正常方法是使用复制构造函数并重载operator=.但是,因为我不知道是否a是类型Derived1,Derived2或者Derived3,我想不出使用复制构造函数的方法operator=.我能想到的唯一方法是干净利落地完成这项工作:

class Base
{
public:
  virtual Base* Clone() = 0;

};
Run Code Online (Sandbox Code Playgroud)

Clone派生类中的实现如下:

class Derivedn : public Base
{
public:
  Base* Clone() 
  {
    Derived1* ret = new Derived1;
    copy all the data members
  }
};
Run Code Online (Sandbox Code Playgroud)

Java倾向于使用Clone相当多的C++方式更多吗?

Mic*_*son 35

这仍然是我们在C++中为多态类做的事情,但是如果为对象创建了一个复制构造函数(可能是隐式或私有),则不需要执行成员的显式复制.

class Base
{
public:
  virtual Base* Clone() = 0;
};

class Derivedn : public Base
{
public:
  //This is OK, its called covariant return type.
  Derivedn* Clone() 
  {
    return new Derivedn(*this);
  }
private:
  Derivedn(const Derivedn) : ... {}
};
Run Code Online (Sandbox Code Playgroud)

  • Clone()不一定是抽象的.如果子类共享公共数据,则可以使用基类的复制构造函数来复制公共部分,并使用虚拟副本构造函数来处理复制变体部分.无论哪种方式完成,每个派生类都需要自己的克隆方法. (2认同)
  • 它确实有效,直到您需要访问Derived由于某种原因 - 在此处使用协变返回并不需要任何费用,以后可能会有所帮助.(当我使用这种模式时,我确实发现它很有用) (2认同)
  • 这是很多biolerplaite代码.必须为每个派生类写出克隆函数.有没有办法分配将在运行时指定的类的新实例? (2认同)
  • 那么必须为每个子类实现完全相同的方法吗?那只是粗略的:( (2认同)