Como copiar / criar uma instância de class derivada de um ponteiro para uma class base polimórfica?

Eu tenho lutado com esse tipo de problema há muito tempo, então decidi perguntar aqui.

class Base { virtual ~Base(); }; class Derived1 : public Base { ... }; class Derived2 : public Base { ... }; ... // Copies the instance of derived class pointed by the *base pointer Base* CreateCopy(Base* base); 

O método deve retornar uma cópia criada dinamicamente ou, pelo menos, armazenar o object na pilha em alguma estrutura de dados para evitar o problema de “retornar o endereço de um temporário”.

A abordagem ingênua para implementar o método acima seria usar vários typeid s ou dynamic_cast s em uma série de if-statements para verificar cada tipo derivado possível e, em seguida, usar o new operador. Existe alguma outra abordagem melhor?

PS: Eu sei que esse problema pode ser evitado usando pointers inteligentes, mas estou interessado na abordagem minimalista, sem um monte de bibliotecas.

    Você adiciona um virtual Base* clone() const = 0; na sua class base e implementá-lo adequadamente em suas classs Derived. Se a sua Base não é abstrata, você pode chamar seu construtor de cópia, mas isso é um pouco perigoso: se você esquecer de implementá-lo em uma class derivada, você obterá cortes (provavelmente indesejados).

    Se você não quiser duplicar esse código, você pode usar o idioma do CRTP para implementar a function através de um modelo:

     template  class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast(*this)); // call the copy ctor. } }; class Derived1 : public DerivationHelper  { ... }; class Derived2 : public DerivationHelper  { ... }; 

    Uma alternativa é ter um método CreateCopy() virtual puro na base comum que é implementada em cada class derivada.