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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Funciones virtuales
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funciones virtuales  (Leído 2,101 veces)
eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Funciones virtuales
« en: 29 Julio 2012, 13:04 pm »

Buenas, tengo dos dudillas acerca de las funciones virtuales, a ver si me las podéis resolver:

Código
  1. class ClaseA
  2. {
  3. public:
  4.   virtual void funcion () {};
  5.  
  6. };
  7.  
  8. class ClaseB : public ClaseA
  9. {
  10.   void funcion () {};
  11. };
  12.  
  13. int main ()
  14. {
  15.   ClaseA *objeto = new ClaseB;
  16.  
  17. }

Hemos creado un objeto de tipo "ClaseA" pero hemos reservado memoria del tamaño "ClaseB". Y al declarar "funcion" como virtual, cada vez que la llamemos estaremos accediendo a la que hay en la clase que hereda y no a la de la clase base. Pero, ¿de qué nos sirve exactamente esto?. ¿No sería lo mismo que declarar el objeto de tipo ClaseB y sobrecargar la función sin añadir "virtual"?:

Código
  1. class ClaseA
  2. {
  3. public:
  4.   void funcion () {};
  5.  
  6. };
  7.  
  8. class ClaseB : public ClaseA
  9. {
  10.   void funcion () {};
  11. };
  12.  
  13. int main ()
  14. {
  15.   ClaseB *objeto = new ClaseB; //Hemos sobrecargado "funcion" asi que se llamará a la de la clase que hereda
  16.  
  17. }


Y luego también he leído ejemplos en los que hace lo siguiente:

Código
  1. class ClaseA
  2. {
  3. public:
  4.   virtual void funcion () {};
  5.  
  6. };
  7.  
  8. class ClaseB : public ClaseA
  9. {
  10.   void funcion () {};
  11. };
  12.  
  13. int main ()
  14. {
  15.   ClaseB *objeto = new ClaseB;
  16.  
  17. }

Es decir, declaramos un objeto de tipo "ClaseB" y reservamos memoria también "ClaseB", sin embargo usa la función "virtual" en la clase base. ¿Por qué?, ¿para qué añadir "virtual" si sin ella automáticamente se sobrecarga la función y se llama a la de la clase que hereda (como en el ejemplo anterior)?.

Gracias y saludos.


« Última modificación: 29 Julio 2012, 13:07 pm por eleon » En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Funciones virtuales
« Respuesta #1 en: 29 Julio 2012, 15:24 pm »

Cuando escribes virtual en un metodo de una clase, es para obligar a la clase derivada a que tenga que implementar el metodo virtual, entiendase, tener que OBLIGATORIAMENTE añadirla al cuerpo de la clase y colocarle el cuerpo del metodo.


En línea

eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Re: Funciones virtuales
« Respuesta #2 en: 29 Julio 2012, 22:51 pm »

Vale, pero entonces para qué sirve declarar un objeto de tipo "ClaseA" y reservar memoria de tipo "ClaseB", es decir, para qué sirve hacer esto:

ClaseA *puntero = new ClaseB.

Saludos.

EDITO:
Cuando escribes virtual en un metodo de una clase, es para obligar a la clase derivada a que tenga que implementar el metodo virtual, entiendase, tener que OBLIGATORIAMENTE añadirla al cuerpo de la clase y colocarle el cuerpo del metodo.

Para nada, acabo de probarlo y puedes hacer lo siguiente perfectamente:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class ClaseA
  5. {
  6. public:
  7.   virtual void funcion () {cout << "Clase A";};
  8. };
  9.  
  10. class ClaseB : public ClaseA
  11. {
  12.  
  13. };
  14.  
  15. int main ()
  16. {
  17. ClaseB objeto;
  18. objeto.funcion(); //Se llama a la función de "ClaseA"
  19.  
  20. cin;
  21. return 0;
  22. }

El compilador no te obliga a sobrecargar la función en la clase derivada si añades "virtual" en la clase base; cuando no encuentra la función en la clase derivada directamente usa la de la clase base.

La única utilidad que le he encontrado a "virtual" es al hacer lo siguiente: ClaseA *puntero = new ClaseB; entonces como el puntero es de tipo ClaseA no puedes leer la función de "ClaseB" si la has sobrecargado, por ello se añade virtual.

Entonces volvemos a la pregunta inicial, para qué sirve declarar un objeto de tipo "ClaseA" y reservar memoria de tipo "ClaseB", es decir, para qué sirve hacer esto:

ClaseA *puntero = new ClaseB.

Y si lo hacemos de la manera "habitual" es decir, tanto el tipo del puntero como la memoria reservada son de ClaseB, ¿para qué sirve añadir "virtual" en la clase base? si obtenemos el mismo efecto si no lo usamos (y eso es algo que he visto en muchos códigos).

Saludos.
« Última modificación: 29 Julio 2012, 23:42 pm por eleon » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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