在C ++中复制一个Polymorphic对象

我有派生Derived1Derived2Derived1基类Base

我已经为我存储为Base* a的派生类之一构造了一个实例。 我现在需要做一个对象的深层拷贝,我将把它存储为Base* b

据我所知,复制类的正常方法是使用复制构造函数并重载operator= 。 但是因为我不知道aDerived1Derived2还是Derived1 ,所以我想不出使用拷贝构造函数或者operator= 。 我能想到干净地做这个工作的唯一方法是实现类似于:

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

和实现Clone在派生类如下:

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

Java倾向于使用Clone相当多是有更多的C ++方式这样做?

这仍然是我们如何在C ++中用于多态类的东西,但是如果为对象创build一个复制构造函数(可能是隐式的或私有的),则不需要执行成员的显式副本。

 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) : ... {} }; 
 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"); } 

这个函数对派生类唯一需要的是它们的拷贝构造函数是可公开访问的。