Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] ¿Llamar a la clase padre?

Estas en el tema de ¿Llamar a la clase padre? en el foro de C/C++ en Foros del Web. Dado una clase así: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original class A {       int ejemplo ( ) { return 1 ; } ...
  #1 (permalink)  
Antiguo 18/11/2014, 14:50
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
¿Llamar a la clase padre?

Dado una clase así:
Código C++:
Ver original
  1. class A
  2. {
  3.       int ejemplo() { return 1;}
  4. }
  5.  
  6. class B
  7. {
  8.     int ejemplo(){return 2;}
  9. }

¿Que pasa si en algun momento de la clase B, quiero llamar al método ejemplo() pero correspondiente a la clase padre? En Java se puede con super, pero en C++ no caigo como hacerlo.

Y si se puede, ¿ese comportamiento es transferible a la herencia multiple?
  #2 (permalink)  
Antiguo 18/11/2014, 15:04
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: ¿Llamar a la clase padre?

Para poder llamar a la clase padre, antes tienes que hacer que una clase herede de la otra.

Algo así:

Código C++:
Ver original
  1. class A
  2. {
  3.       int ejemplo() { return 1;}
  4. }
  5.  
  6. class B : public A
  7. {
  8.     int ejemplo(){return 2;}
  9. }

En este caso, para llamar a la clase padre se debe escribir el siguiente código:

Código C++:
Ver original
  1. class A
  2. {
  3.       int ejemplo() { return 1;}
  4. }
  5.  
  6. class B : public A
  7. {
  8.     int ejemplo(){return 2 + A::ejemplo();}
  9. }

Este planteamiento también es válido para operadores:

Código C++:
Ver original
  1. class A
  2. {
  3.       A operator=(const A& original) { ... }
  4. }
  5.  
  6. class B : public A
  7. {
  8.     B operator=( const B& original )
  9.     {
  10.        ...
  11.  
  12.       A::operator=(original);
  13.  
  14.       return *this;
  15.     }
  16. }

Como inciso, comentar que si la función sobreescrita no se declara como "virtual" en la clase padre se pueden producir resultados extraños al tirar de polimorfismo:

Código C++:
Ver original
  1. class A
  2. {
  3.   public:
  4.       int ejemplo() { return 1;}
  5. }
  6.  
  7. class B : public A
  8. {
  9.   public:
  10.     int ejemplo(){return 2;}
  11. }
  12.  
  13. int main( )
  14. {
  15.   A* a1 = new A( );
  16.   B* b = new B( );
  17.   A* a2 = b;
  18.  
  19.   std::cout << a1->ejemplo( ) << b->ejemplo( ) << a2->ejemplo( ) << std::endl;
  20. }

resultado:

Código BASH:
Ver original
  1. 121

Sin embargo, como comentaba, si aplicas el modificador "virtual" la cosa cambia:

Código C++:
Ver original
  1. class A
  2. {
  3.   public:
  4.       virtual int ejemplo() { return 1;}
  5. }
  6.  
  7. class B : public A
  8. {
  9.   public:
  10.     int ejemplo(){return 2;}
  11. }
  12.  
  13. int main( )
  14. {
  15.   A* a1 = new A( );
  16.   B* b = new B( );
  17.   A* a2 = b;
  18.  
  19.   std::cout << a1->ejemplo( ) << b->ejemplo( ) << a2->ejemplo( ) << std::endl;
  20. }

Resultado:

Código BASH:
Ver original
  1. 122

Espero que con esto te haya resuelto la duda :)

Un saludo.
  #3 (permalink)  
Antiguo 18/11/2014, 15:06
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: ¿Llamar a la clase padre?

De hecho, como C++ permite herencia múltiple no tiene sentido referenciar a la clase padre con el alias super. Así que se referencia con el nombre de la clase padre seguido de dos puntos:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. class A
  4. {
  5.     public:
  6.         int ejemplo() { return 1;}
  7. };
  8.  
  9. class B : public A
  10. {
  11.     public:
  12.         int ejemplo(){return 2;}
  13.  
  14.         int ejemploPadre() {
  15.             return A::ejemplo();
  16.         }
  17. };
  18.  
  19. int main() {
  20.     B b;
  21.     std::cout << b.ejemploPadre() << std::endl;
  22.     return 0;
  23. }

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #4 (permalink)  
Antiguo 18/11/2014, 15:48
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: ¿Llamar a la clase padre?

Todo claro, gracias ^^

Etiquetas: clase, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:16.