2011-09-23 13 views
23

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
+0

B, no D. Sólo hay una en B – towi

+2

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". –

+0

@litb: ok. gracias. actualizado de nuevo – towi

Respuesta

22

¿Qué pasa si B::f no habrían sido marcada virtual? ¿El programa está mal formado, entonces?

Sí, lo es. Porque para anular algo, ese algo tiene que ser virtual. De lo contrario, no es anulando, es ocultando. Entonces, la respuesta positiva sigue de la cita en su pregunta.

+2

¿Puede proporcionar una referencia estándar? –

+1

No estoy de acuerdo: la formulación que cité no hace ninguna declaración sobre "funciones no virtuales". Solo el ejemplo lo hace Curiosamente 'void D :: f (long);' en sí mismo es ** no ** * virtual *, porque no anula 'virtual void B :: f (int)'. Por lo tanto, el texto citado no se aplica para la 'anulación' adicional detrás de 'D :: f (long)'. Es por eso que me confundí ... – towi

+1

@towi: La cita dice: Si la función marcada con virtual no *** anula *** ... entonces el programa está mal formado. El término *** anulación *** se puede aplicar *** solo *** a funciones virtuales, por lo que si la función, cuya firma coincide con su nueva función, no es virtual, entonces *** esta nueva función no funciona anularlo ***, por lo tanto, la cotización se aplica –

0

Si B:f era no virtual, entonces ambosD:f funciones sería mal formadas.

+0

¿Por qué? El texto que cité solo se refiere a "funciones vertuales". Si 'B :: f' no es virtual, entonces el texto no se aplica. – towi

+0

@towi Este texto realmente se refiere a 'D :: f', no' B :: f'.Las funciones 'D :: f' son aún virtuales, pero intentan anular una función' ya no más virtual 'B :: f', por lo tanto ambas funciones' D :: f' están mal formadas. –

0

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

En general, las funciones con diferentes firmas (sobrecargadas) son tan diferentes como las funciones con diferentes nombres.El ejemplo dado en la especificación no implica que el nombre de la función tenga el efecto override. Está destinado a mostrar el error común que override está diseñado para prevenir.

Cuestiones relacionadas