virtuales puro poo polimorfismo modificador herencia funciones ejemplo codigo clase abstracta c++ attributes override virtual c++11

poo - polimorfismo puro c++



anular funciones no virtuales (3)

¿Y si B::f no hubiera sido marcado como virtual? ¿Está el programa mal formado, entonces?

Sí lo es. Porque para anular algo, ese algo tiene que ser virtual. De lo contrario no es primordial , se esconde . Por lo tanto, la respuesta positiva se deduce de la cita en su pregunta.

El C ++ 11 FDIS dice

Si una función virtual está marcada con la anulación de virt-specifier 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 };

¿Y si B::f no hubiera sido marcado como virtual? ¿Está el programa mal formado, entonces? O se override entonces para ser ignorado ''. No puedo encontrar ningún manejo de este caso en el texto estándar.

Actualización 1/2 (fusionada) Reenvié una solicitud a los editores de C ++ para que examinen las cosas. Gracias Johannes por señalarme eso.

  • "void f (long) override" no anula una función, esp. ninguna virtual,
  • por lo tanto no es virtual
  • por lo tanto, el texto "Si una función virtual está marcada con ..." no se aplica
  • por lo tanto el ejemplo no coincide con el texto.

Pero al darme cuenta de esto, descubrí que la intención de la palabra clave contextual "anular" no se puede cumplir: si un error tipográfico en el nombre de la función o el tipo de argumento incorrecto hace que la función en sí 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

  • Poniendo "virtual" frente a las funciones del ejemplo.

Sí, el programa está mal formado cuando se agrega la override a cualquier función no virtual.

En general, las funciones con firmas diferentes (sobrecargadas) son tan diferentes como las funciones con nombres diferentes. El ejemplo dado en la Especificación no pretende implicar que los efectos del nombre de la función se override . Tiene la intención de mostrar el error común que la override está diseñada para prevenir.


Si B:f no fuera virtual, entonces ambas funciones D:f estarían mal formadas.