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
*/
![]() |
![]() ![]() |