Per evitare tutto questo giro di codice è sufficiente implementare il pattern prototype.
In questo modo puoi fare semplicemente:
codice:
class TipoPuntatore {
    public:
        ...
        virtual TipoPuntatore* clone()=0;
        ...
};

class Concreta : public TipoPuntatore {
     double d;
     public:
     TipoPuntatore* clone() {
          Concreta* temp = new Concreta;
          temp->d = this->d;
          return temp;
     }

};
...
Prova::Prova(const Prova& da_copiare) {
    mPuntatore = da_copiare.mPuntatore->clone();
}