在C ++中复制多态对象

时间:2011-02-28 23:13:53

标签: c++ clone

我有基类Base,派生自Derived1Derived2Derived3

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

据我所知,复制类的正常方法是使用复制构造函数并重载operator=。但是,由于我不知道aDerived1Derived2还是Derived3,我想不出使用复制构造函数或{{1}的方法}}。我能想到干净利落地完成这项工作的唯一方法就是实现:

operator=

和派生类中的实现class Base { public: virtual Base* Clone() = 0; }; 如下:

Clone

Java倾向于使用class Derivedn : public Base { public: Base* Clone() { Derived1* ret = new Derived1; copy all the data members } }; ,有更多的C ++方法吗?

2 个答案:

答案 0 :(得分: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) : ... {}
};

答案 1 :(得分:2)

template <class T>
Base* Clone (T derivedobj) {
  T* derivedptr = new T(derivedobj);
  Base* baseptr = dynamic_cast<Base*>(derivedptr);
  if(baseptr != NULL) {
    return baseptr;
  }
  // this will be reached if T is not derived from Base
  delete derivedptr;
  throw std::string("Invalid type given to Clone");
}

此函数对派生类的唯一要求是它们的复制构造函数是公共可访问的。