C ++ clona elegantemente a classe derivada chamando a classe base
Eu tenho uma necessidade de clonar uma classe derivada, dada apenas uma referência ou ponteiro para a classe base. O código a seguir faz o trabalho, mas não parece elegante, porque estou colocando o código padrão em muitas classes derivadas C, D, E que são irmãos de B (não mostrados) que apenas chamam o construtor de cópias padrão de cada um. Não é para isso que serve o construtor de cópias padrão, se ele puder ser virtual?
Existe uma maneira melhor?
Criar um operador de atribuição virtual seria errado, pois não quero que C atribua a B, B a D, etc., apenas clone B, C, D ou E.
#include <iostream>
using namespace std;
class A {
public:
virtual ~A() {}
virtual A* clone()=0;
};
class B : public A {
int i;
public:
virtual A* clone() {
cout << "cloned B" << endl;
return new B(*this);
}
virtual ~B() { cout << "destroyed b" << endl; }
};
int main() {
A* a = new B();
A* aa = a->clone();
delete a;
delete aa;
return 0;
}