Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: digimikeh en 15 Noviembre 2020, 02:03 am



Título: herencia : funcion virtual no se ejecuta..
Publicado por: digimikeh en 15 Noviembre 2020, 02:03 am
Hola amigos..
Que pasa en este codigo que la funcion virtual do_xy() en x no se está ejecutando?

Código
  1. #include <iostream>
  2.  
  3. struct x{  
  4.  x(){}
  5.  ~x(){}
  6.  
  7. protected:
  8.  virtual void do_xy(){
  9.      cout << "from x " << endl;     //esto no se ejecuta
  10.  }  
  11. };
  12.  
  13. struct y : public x{
  14.  y(){}
  15.  ~y(){}
  16.  
  17. public:
  18.  void do_xy() override{
  19.      cout << "from y " << endl;     //esto se ejecuta
  20.  }    
  21. };
  22.  
  23. int main(){
  24.    y _y;
  25.    _y.do_xy();
  26.  
  27.    cin.get();
  28.    return 0;
  29. }
  30.  

Saludos.. gracias.


Título: Re: herencia : funcion virtual no se ejecuta..
Publicado por: K-YreX en 15 Noviembre 2020, 02:31 am
Claro.

En este caso en concreto no se ejecuta por 2 motivos:
  • La variable creada es del tipo de la struct derivada. Entonces se llama a la función definida ahí.
  • Una función virtual se define así para eso, para poder llamar a la función más adecuada en tiempo de ejecución

Si creas las funciones sin usar virtual, se decide en tiempo de compilación a qué función llamar:
Código
  1. struct Base {
  2.  void show(){
  3.    cout << "Base" << endl;
  4.  }
  5. };
  6.  
  7. struct Derived : Base {
  8.  void show(){
  9.    cout << "Derived" << endl;
  10.  }
  11. };
  12.  
  13. int main(){
  14.  Base b;
  15.  b.show(); // b es de tipo Base, se muestra: Base
  16.  Derived d;
  17.  d.show(); // d es de tipo Derived, se muestra: Derived
  18.  // LA DIFERENCIA ESTA AQUI:
  19.  Base *p = &b;
  20.  p->show(); // El puntero es de tipo Base, se muestra: Base
  21.  p = &d;
  22.  p->show(); // El puntero sigue siendo de tipo Base, se muestra: Base
  23. }

En cambio, si definimos la función como virtual:
Código
  1. struct Base {
  2.  virtual void show(){
  3.    cout << "Base" << endl;
  4.  }
  5. };
  6.  
  7. struct Derived : Base {
  8.  void show(){
  9.    cout << "Derived" << endl;
  10.  }
  11. };
  12.  
  13. int main(){
  14.  Base b;
  15.  b.show(); // b es de tipo Base, se muestra: Base
  16.  Derived d;
  17.  d.show(); // d es de tipo Derived, se muestra: Derived
  18.  // LA DIFERENCIA ESTA AQUI:
  19.  Base *p = &b;
  20.  p->show(); // La variable a la que apunta es de tipo base, se muestra: Base
  21.  p = &d;
  22.  p->show(); // La variable a la que apunta es de tipo derived, se muestra: Derived
  23. }

No sé si se ve bien. La diferencia es que si la función es virtual, en tiempo de ejecución se comprueba de qué tipo es la variable a la que está apuntando un puntero y se utiliza su función correspondiente. Si no se usa virtual, el compilador coge el tipo del puntero y llama a la función de su clase sin importarle de qué clase es la variable a la que apunta.


Título: Re: herencia : funcion virtual no se ejecuta..
Publicado por: digimikeh en 15 Noviembre 2020, 02:38 am
Entiendo, gracias..

La idea mia es que se ejecute en cadena.. como un ensamble, es decir, la linea

Código
  1. _y.do_xy();
  2.  

deberia ejecutar:
from x
from y


por esta razon utilice el keyword "override"...


Título: Re: herencia : funcion virtual no se ejecuta..
Publicado por: K-YreX en 15 Noviembre 2020, 02:52 am
Para llamar a la función de la clase base tienes que usar ::.
Código
  1. struct Base {
  2.  virtual void show(){
  3.    cout << "Base" << endl;
  4.  }
  5. };
  6.  
  7. struct Derived : Base {
  8.  void show(){
  9.    Base::show();
  10.    cout << "Derived" << endl;
  11.  }
  12. };
  13.  
  14. int main(){
  15.  Derived d;
  16.  Base *p = &d;
  17.  p->show();
  18. }

SALIDA:
Código:
Base
Derived


Título: Re: herencia : funcion virtual no se ejecuta..
Publicado por: digimikeh en 15 Noviembre 2020, 03:01 am
perfect!!!... muchas gracias