elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  herencia : funcion virtual no se ejecuta..
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: herencia : funcion virtual no se ejecuta..  (Leído 4,842 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
herencia : funcion virtual no se ejecuta..
« 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.


En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: herencia : funcion virtual no se ejecuta..
« Respuesta #1 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.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: herencia : funcion virtual no se ejecuta..
« Respuesta #2 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"...
En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: herencia : funcion virtual no se ejecuta..
« Respuesta #3 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
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: herencia : funcion virtual no se ejecuta..
« Respuesta #4 en: 15 Noviembre 2020, 03:01 am »

perfect!!!... muchas gracias
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines