PUNTEROS EN HERENCIAS
El C++ permite que un puntero a un objeto de una clase base apunte directamente a un objeto de una clase derivada, sin emplear una notación "cast".
Cuando se accesa a un objeto por medio de un puntero, el tipo de puntero determina qué función miembro puede ser llamada. Por lo tanto, cuando accedemos a un objeto de una clase derivada por medio de un puntero de una clase base, el objeto referenciado sólo puede ser manipulado por métodos de su clase base.
Así:
En caso contrario, es decir un puntero a una clase derivada puede apuntar a un objeto de una clase base solamente si se emplea una notación "cast".
Ejemplo:
// Punteros a clases derivadas #include<iostream.h> #include<conio.h> class A { int a; public: void DefineA(int); int DameA(void); void mostrar(void); }; void A::DefineA(int x) { a= x; } int A::DameA(void) { return a; } void A::mostrar(void) { cout << "Clase A" << endl; cout << "a = " << a << endl; } class B : public A { int b; public: void DefineB(int); void mostrar(void); void mostrarA(void); }; void B::DefineB(int x) { b= x; } void B::mostrar(void) { cout << "Clase B" << endl; cout << "b = " << b << endl; } void B::mostrarA(void) { cout << "Clase B" << endl; cout << "a = " << DameA() << endl; } void main (void) { A *pa; B *pb; clrscr(); pb = new B; pb->DefineA(10); pb->DefineB(5); cout << "Desde pb :" << endl; pb->mostrar(); // 1ra. Parte: pa apunta a objeto de clase B pa = pb; pa->DefineA(25); // pa->DefineB(25); INVALIDO: no se puede acceder a los //métodos de la clase derivada B cout << "pa apunta a objeto de clase B:" << endl; pa->mostrar(); pa = new A; pa->DefineA(35); cout << "Dese pa :" << endl; pa->mostrar(); //ejecuta el método definido en B // pb = pa; INVALIDO pb = (B*)pa; pb->DefineB(82); cout << "pb apunta a objeto de clase A:" << endl; pb->mostrarA(); pb->mostrar(); //ejecuta el método definido en A pb->DefineA(56); pb->mostrarA(); } /* Al ejecutar el programa se obtiene: Desde pb : Clase B b = 5 pa apunta a objeto de clase B: Clase A a = 25 Desde pa : Clase A a = 35 pb apunta a objeto de clase A: Clase B a = 35 Clase B b = 82 Clase B a = 56 */
![]() |
![]() ![]() |