// Punteros a clases derivadas #include #include class A { int a; public: void DefineA(int); int DameA(void); virtual 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 DefineB no es un método // de la clase A cout << "pa apunta a objeto de clase B:" << endl; pa->mostrar(); //ejecuta el método definido en B // 2da. Parte : pb apunta a un objeto de clase A pa = new A; pa->DefineA(35); cout << "Dese pa :" << endl; pa->mostrar(); //ejecuta el método definido en A // 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 B b = 5 Dese pa : Clase A a = 35 pb apunta a objeto de clase A: Clase B a = 35 Clase A a = 35 Clase B a = 56 */