• Jueves 14 de Noviembre de 2024, 17:00

Autor Tema:  Funciones virtuales y herencia  (Leído 1015 veces)

killrazor

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Funciones virtuales y herencia
« en: Viernes 29 de Enero de 2010, 10:19 »
0
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.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Funciones virtuales y herencia
« Respuesta #1 en: Viernes 29 de Enero de 2010, 20:33 »
0
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 :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================