El C++ 11 FDIS diceanulación de funciones no virtuales
Si una función virtual está marcado con la anulación de virt-especifica y no anula una función miembro de una clase base , el programa está mal formado. [Ejemplo:
struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK };
¿Qué pasa si B::f
no habría sido marcada virtual? ¿El programa está mal formado, entonces? O es override
que luego se ignorará`. No puedo encontrar ningún manejo de este caso en el texto estándar.
Actualización 1/2 (fusionada) Remití una solicitud a los Editores de C++ para que investigaran las cosas. Gracias Johannes a señalarme eso.
- "void f (long) override" no anula una función, esp. nadie virtual,
- por lo tanto no es virtual
- por lo tanto, el texto "Si una función virtual está marcado con ..." no se aplica
- por lo tanto, el ejemplo no coincide con el texto.
Pero al darme cuenta encontré que la intención de la palabra clave contextual "anular" no puede cumplirse: si un error en el nombre de la función o en el tipo de argumento incorrecto hace que la función no sea virtual, entonces el texto del estándar nunca se aplica, y "anular" se vuelve inútil.
La mejor solución posible puede ser
- poner "virtual" en frente de las funciones del ejemplo
B, no D. Sólo hay una en B – towi
El planteamiento del problema que realice en la respuesta actualizada ya está resuelto por 9.2p9 (ver sección de comentarios de respuesta aceptada). 9.2p9 prohíbe poner "anulación" en funciones no virtuales. El único problema que veo es el ejemplo, y se puede resolver simplemente poniendo "virtual" antes de la función "f" en "D". –
@litb: ok. gracias. actualizado de nuevo – towi