Copiar un objeto polimórfico en C ++

Tengo base de clase Base de la cual deriva Derived1 , Derived2 y Derived3 .

He construido una instancia para una de las clases derivadas que almaceno como Base* a . Ahora necesito hacer una copia profunda del objeto que almacenaré como Base* b .

Hasta donde yo sé, la forma normal de copiar una clase es usar constructores de copia y sobrecargar operator= . Sin embargo, dado que no sé si a es del tipo Derived1 , Derived2 o Derived3 , no puedo pensar en una forma de usar el constructor de copia u operator= . La única forma en que puedo pensar para hacer que esto funcione limpiamente es implementar algo como:

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

y el implemento Clone en la clase derivada como en:

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

Java tiende a usar Clone bastante ¿hay más de una forma C ++ de hacer esto?

    Así es como hacemos las cosas en C ++ para las clases polimórficas, pero no necesita hacer una copia explícita de los miembros si crea un constructor de copia (posiblemente implícita o privada) para sus objetos.

     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::string("Invalid type given to Clone"); } 

    Lo único que esta función requiere de las clases derivadas es que su constructor de copia sea de acceso público.