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

Sorcerer sorcerer.cl en gmail.com
Sab Ene 20 06:12:14 CET 2007


Gracias por la explicación, me aclaro bastante pero me generó una nueva duda :S

Voy a ir explicando lo q pienso entre medio xq creo que así es más fácil ver si entendí algo mal.

Cuando hacen:

> Persona *Carlos = new Empleado("Carlos");
> Gente[0] = Carlos->Clonar();

"Carlos" es un objeto de tipo Empleado, aunque el puntero apunte hacia un objeto de tipo Persona. Así es, ¿cierto? :S
Entonces, le sigo la pista al objeto para ver que hace la función clonar de la class Empleado (xq el objeto era de ese tipo y la función clonar es virtual):

> virtual Persona* Clonar() { return new Empleado(*this); }

Como usan new, crean un objeto nuevo. Ese nuevo objeto es de tipo Empleado y la idea es que sea una copia del objeto que se esta trabajando en ese momento, xq usan el puntero this. Ya... entonces ahora me voy al constructor de la class Empleado, que eso es lo que se esta llamando y le pasan como parámetro *this:

> Empleado::Empleado(const Empleado &e) : Persona(e) {
>   cout << "Emp: constructor copia." << endl;
> }

Y he aquí mi gran duda: En este constructor lo que hacen es... ¿ Llamar al constructor de Persona (con Persona(e)) ?. Porque en este caso, "e" es una referencia a un objeto de tipo Empleado, sin embargo el constructor de la class Persona es:

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

Y este constructor trabaja con un objeto de tipo Persona, no de tipo Empleado... que es el tipo que le estamos pasando :S

No se si le seguí mal la pista al objeto y por eso llegué a esto, sino... entonces no entiendo la idea de crear una función virtual para llamar al constructor correcto, si al final le pasamos un objeto de cualquier tipo al constructor copia de Persona y lo trabajamos como si fuera de tipo Persona :S

Perdón por preguntar tanto xD
Y muuuuchas gracias por la ayuda :]


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