Palabra clave "virtual" de C++ para funciones en clases derivadas. ¿Es necesario?
Con la definición de estructura dada a continuación...
struct A {
virtual void hello() = 0;
};
Enfoque #1:
struct B : public A {
virtual void hello() { ... }
};
Enfoque #2:
struct B : public A {
void hello() { ... }
};
¿Existe alguna diferencia entre estas dos formas de anular la función de saludo?
Son exactamente lo mismo. No hay ninguna diferencia entre ellos aparte de que el primer enfoque requiere más escritura y es potencialmente más claro.
La 'virtualidad' de una función se propaga implícitamente; sin embargo, al menos un compilador que uso generará una advertencia si la virtual
palabra clave no se usa explícitamente, por lo que es posible que desee usarla aunque solo sea para mantener el compilador en silencio.
Desde un punto de vista puramente estilístico, incluir la virtual
palabra clave claramente "anuncia" al usuario el hecho de que la función es virtual. Esto será importante para cualquiera que subclase B sin tener que verificar la definición de A. Para jerarquías de clases profundas, esto se vuelve especialmente importante.