Código
class ClaseA { public: virtual void funcion () {}; }; class ClaseB : public ClaseA { void funcion () {}; }; int main () { ClaseA *objeto = new ClaseB; }
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
class ClaseA { public: void funcion () {}; }; class ClaseB : public ClaseA { void funcion () {}; }; int main () { ClaseB *objeto = new ClaseB; //Hemos sobrecargado "funcion" asi que se llamará a la de la clase que hereda }
Y luego también he leído ejemplos en los que hace lo siguiente:
Código
class ClaseA { public: virtual void funcion () {}; }; class ClaseB : public ClaseA { void funcion () {}; }; int main () { ClaseB *objeto = new ClaseB; }
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.