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:
Para nada, acabo de probarlo y puedes hacer lo siguiente perfectamente:
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.
ClaseA *puntero = new ClaseB.
Saludos.
EDITO:
Cita de: [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.
Para nada, acabo de probarlo y puedes hacer lo siguiente perfectamente:
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
class ClaseA
{
public:
virtual void funcion () {cout << "Clase A";};
};
class ClaseB : public ClaseA
{
};
int main ()
{
ClaseB objeto;
objeto.funcion(); //Se llama a la función de "ClaseA"
cin;
return 0;
}
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.