Punteros a clases derivadas
En C++ el polimorfismo se admite tanto en el momento de la compilación, como en el de la ejecución. La sobrecarga de operadores y funciones es un ejemplo de polimorfismo en el momento de la compilación. Para conseguir el polimorfismo en el momento de la ejecución C++ permite usar clases derivadas y funciones virtuales.
En C++ los punteros a clases base y a clases derivadas están relacionados. Mediante un puntero de una clase base es posible acceder a una clase derivada, aunque no es posible a la inversa. Por ejemplo:
clase_B *p; clase_B tipo base
clase_B B_ob; clase_D derivado de clase_B
clase_D D_ob;
p=&B_ob; // p apunta a un objeto del tipo clase_B
p=&D_ob; // p apunta a un objeto del tipo clase_D
Usando p, se puede acceder a todos los elementos de D_ob heredados de B_ob. Sin embargo, los elementos específicos de la D_ob no pueden ser referenciados usando p, a menos que se utilice una refundición de tipos.
class X {
protected:
char nombre[30];
public:
void mostrar (void);
void nombrar (char *nom);
};
class Y : public X {
int edad;
public:
void mostrarY (void);
void poneredad (int ed);
};
main ( )
{
X x;
Y y;
X *px;
Y *py;
((Y *) px)-> poneredad (16) // Accedemos a los no miembros de X
((Y *) px)-> mostrarY ( ) // refundiendo el tipo del puntero