Las funciones virtuales han existido en C++ desde el principio como un medio de polimorfismo dinámico. Sin embargo, anteriormente no había un mecanismo sintáctico que obligara al compilador a verificar la corrección de la redefinición de funciones virtuales en las clases derivadas. Con la llegada de C++11, la palabra clave override se convirtió en una herramienta para una verificación adicional del compilador.
Sin override, el compilador no garantiza que la función realmente esté redefiniendo el método de la clase base. Los errores en la firma (por ejemplo, tipo incorrecto o const) conducen a la creación de una nueva función en la clase derivada ("sombreraje"), lo que rompe el polimorfismo y dificulta la depuración.
Usar override al declarar una función virtual en la clase derivada permite al compilador verificar que la firma coincide exactamente con la función virtual de la clase padre y que la función realmente está redefiniendo la función padre. De lo contrario, la compilación se interrumpe con un error.
Ejemplo de código:
struct Base { virtual void foo() const {} }; struct Derived : Base { void foo() const override { /* implementación */ } };
Si en Derived se escribe void foo() sin const override, el compilador dará un error.
Características clave:
¿Se puede dejar una función virtual con la palabra clave 'override', pero sin la palabra clave 'virtual'?
Sí, override implica que la función es virtual. Es redundante especificar virtual junto con override, pero no está prohibido.
¿Es posible un error si la función difiere solo por el modificador const o ref qualifier (por ejemplo, & o &&)?
Sí, cualquier diferencia en la firma, incluso en const/referencias, rompe la redefinición. Por ejemplo, void foo() override no redefine void foo() const, y el compilador, gracias a override, lo detectará.
¿Se puede aplicar 'override' a funciones estáticas o constructores?
No. override es solo para funciones virtuales, no se puede aplicar a funciones estáticas, constructores ni destructores (a menos que sean virtuales).
override al redefiniroverride en función estática o no virtualEn un gran proyecto, la clase derivada tiene un error tipográfico en la firma de la función: la función de hecho no está redefiniendo, pero el desarrollador piensa de otra manera, el polimorfismo no funciona como se esperaba.
Ventajas:
Desventajas:
En todas las clases derivadas se utiliza override, las pruebas detectan errores ya en la fase de compilación.
Ventajas:
Desventajas: