[C con Clase] Duda sobre ejemplo de la sección "constructores virtuales"

Sorcerer sorcerer.cl en gmail.com
Sab Ene 20 00:11:44 CET 2007


Hola a todos,

estoy leyendo esta parte del curso: http://c.conclase.net/curso/index.php?cap=037 

En el código de ejemplo para constructores virtuales, crean una función virtual llamada "clonar" para hacer copias de los objetos, diciendo que no se puede hacer directamente xq los constructores (en este caso, entiendo el constructor copia) no pueden ser virtuales.
Esto no me queda claro, como sería un ejemplo de lo que no se puede hacer ?

En el código de ejemplo hice esto:

----------------------------
#include <iostream>
#include <cstring>
using namespace std;

class Persona {
  public:
   Persona(char *n) { strcpy(nombre, n); }
   Persona(const Persona &p);
   virtual void VerNombre() { 
      cout << nombre << endl; 
   }
   virtual Persona* Clonar() { return new Persona(*this); }
  protected:
   char nombre[30];
};

Persona::Persona(const Persona &p) {
   strcpy(nombre, p.nombre);
   cout << "Per: constructor copia." << endl;
}

class Empleado : public Persona {
  public:
   Empleado(char *n) : Persona(n) {}
//   Empleado(const Empleado &e);      // quité el constructor copia
   void VerNombre() { 
      cout << "Emp: " << nombre << endl; 
   }
   virtual Persona* Clonar() { return new Empleado(*this); }
};
/*
Empleado::Empleado(const Empleado &e) : Persona(e) {
   cout << "Emp: constructor copia." << endl;
}
*/
class Estudiante : public Persona {
  public:
   Estudiante(char *n) : Persona(n) {}
//   Estudiante(const Estudiante &e);        //quité el constructor copia
   void VerNombre() { 
      cout << "Est: " << nombre << endl; 
   }
   virtual Persona* Clonar() { 
      return new Estudiante(*this); 
   }
};
/*
Estudiante::Estudiante(const Estudiante &e) : Persona(e) {
   cout << "Est: constructor copia." << endl;
}
*/
int main() {
   Persona *Pepito = new Estudiante("Jose");
   Persona *Carlos = new Empleado("Carlos");
   Persona *Gente[2];

   Carlos->VerNombre();
   Pepito->VerNombre();
   
   Gente[0] = Carlos->Clonar();
   Gente[0]->VerNombre();

   Gente[1] = Pepito->Clonar();
   Gente[1]->VerNombre();
   
   delete Pepito;
   delete Carlos;
   delete Gente[0];
   delete Gente[1];
   
   cin.get();
   return 0;
}
-----------------------------
Quité los constructores copia de las 2 clases derivadas a ver que pasaba, la respuesta que me da el programa es esta:

Emp: Carlos
Est: Jose
Per: constructor copia.
Emp: Carlos
Per: constructor copia.
Est: Jose

Pero no me queda claro que es lo que realiza... ¿como yo borré los constructores copia, se generaron otros por defecto?, xq en la respuesta se ve que se llaman los constructores copia de la class Persona, aunque yo no los llamé.

Gracias por la ayuda, tengo un enredo :S


Más información sobre la lista de distribución Cconclase