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;
}

questionAnswers(2)

yourAnswerToTheQuestion