Tengo un código que me he sacado de C ConClase.
El código es el siguiente.
Código
#include <iostream> #include <cstring> using namespace std; class Persona { public: Persona(const 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(const char *n) : Persona(n) {} Empleado(const Empleado &e); 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(const char *n) : Persona(n) {} Estudiante(const Estudiante &e); 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]; return 0; }
La duda que tengo es la siguiente:
Si mal no tengo entendido el puntero "this" hace referencia al objeto desde cual se está llamando a una función (por ejemplo).
Entonces, al llamar a la función "clonar", tengo lo siguiente:
Código
virtual Persona* Clonar() { return new Estudiante(*this); }
Se supone que el parámetro "*this" hace referencia al objeto desde cuál se está llamando, que es de tipo "Persona*", pero el constructor de Estudiante, recibe un estudiante como parámetro y no una Persona. ¿Por qué es válido a hacer eso?
Sé que por polimorfismo, una persona puede ser igual a un estudiante, siempre y cuando estudiante herede de persona. Pero, ¿por qué si la función recibe un parámetro de tipo estudiante puede recibir uno de tipo persona? Es decir, estoy haciendo un estudiante igual a una persona (lo opuesto a lo que mencioné primeramente). Eso debería ser incorrecto, pero no lo es, ¿alguien me puede explicar por favor por qué?
Me estoy ahogando en un vaso de agua, lo sé. xD