Copier un object polymorphe en C ++

J’ai base-classe de Base partir de laquelle est dérivé Derived1 , Derived2 et Derived3 .

J’ai construit une instance pour l’une des classes dérivées que je stocke en tant que Base* a . J’ai maintenant besoin de faire une copie complète de l’object que je vais stocker comme Base* b .

Autant que je sache, la manière habituelle de copier une classe consiste à utiliser des constructeurs de copie et à surcharger l’ operator= . Cependant, étant donné que je ne sais pas si a est de type Derived1 , Derived2 ou Derived3 , je ne vois pas comment utiliser le constructeur de copie ou l’ operator= . La seule façon dont je peux penser à faire ce travail proprement est d’implémenter quelque chose comme:

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

et le Clone implémenter dans la classe dérivée comme dans:

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

Java a plutôt tendance à utiliser Clone Existe-t-il davantage une méthode C ++?

C’est toujours comme ça que nous faisons en C ++ pour les classes polymorphes, mais vous n’avez pas besoin de faire la copie explicite des membres si vous créez un constructeur de copie (éventuellement implicite ou privé) pour vos objects.

 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  Base* Clone (T derivedobj) { T* derivedptr = new T(derivedobj); Base* baseptr = dynamic_cast(derivedptr); if(baseptr != NULL) { return baseptr; } // this will be reached if T is not derived from Base delete derivedptr; throw std::ssortingng("Invalid type given to Clone"); } 

La seule chose que cette fonction exige des classes dérivées est que leur constructeur de copie soit accessible au public.