Título: Funciones virtuales Publicado por: eleon 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
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
Y luego también he leído ejemplos en los que hace lo siguiente: Código
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. Título: Re: Funciones virtuales Publicado por: [L]ord [R]NA 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.
Título: Re: Funciones virtuales Publicado por: eleon 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
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. |