SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: killrazor en Viernes 29 de Enero de 2010, 10:19

Título: Funciones virtuales y herencia
Publicado por: killrazor en Viernes 29 de Enero de 2010, 10:19
Hola,

hay algo que no entiendo sobre las funciones virtuales. Si yo tengo estas clases:

Código: C++
  1. class Base{
  2.     public:
  3.         void func(int a){ cout << "Estoy en la clase Base" << endl;}
  4. };
  5.  
  6. class Derivada:public Base{
  7.     public:
  8.         void func(int a){ cout << "Estoy en la clase Derivada" << endl;}
  9. };
  10.  
  11. int main(){
  12.     Base a;
  13.     a.func(0);
  14.     Derivada b;
  15.     b.func(0);
  16.     return EXIT_SUCCESS;
  17. }
  18.  
Sin necesidad de poner la palabra clave virtual, la salida de b.func() seria "Estoy en la clase derivada". Entonces para que sirve la palabra clave virtual? Yo pensaba que si no poniamos virtual, la funcion de la clase derivada quedaba oculta.
Título: Re: Funciones virtuales y herencia
Publicado por: ProfesorX en Viernes 29 de Enero de 2010, 20:33
Cita de: "killrazor"
Yo pensaba que si no poniamos virtual, la funcion de la clase derivada quedaba oculta.

De hecho, si queda oculta, pero eso sucede cuando utilizamos apuntadores genericos para acceder a las clases padre/hijo, es decir, apuntadores de tipo de la clase base.

Mas claro, tomado tus clases de ejemplo, prueba lo siguiente, primero sin virtual, y despues añadele virtual, y entonces si veras la difeencia:

Código: C++
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class Base{
  7. public:
  8.     void func(int a)
  9.     {
  10.         cout << "Estoy en la clase Base" << endl;
  11.     }
  12. };
  13.  
  14. class Derivada : public Base{
  15. public:
  16.     void func(int a)
  17.     {
  18.         cout << "Estoy en la clase Derivada" << endl;
  19.     }
  20. };
  21.  
  22. int main()
  23. {
  24.     Base *a[2];
  25.     a[0] = new Base();
  26.     a[1] = new Derivada();
  27.  
  28.     for (int i = 0; i < 2; i++)
  29.     {
  30.         a[i]->func(0);
  31.     }
  32.  
  33.     for (int i = 0; i < 2; i++)
  34.     {
  35.         delete a[i];
  36.     }
  37.  
  38.     return 0;
  39. }
  40.  
  41.  

Mas informacion:

http://es.wikipedia.org/wiki/Funci%C3%B3n_virtual

Saludos :)