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:

Grabar este 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
*/


Volver a contenidos AtrásSiguiente