anulación en funciones no virtuales


El FDIS C++11 dice

Si una función virtual está marcada con la invalidación del especificador de virt y no invalida 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? Or is override then to be ignored`. No puedo encontrar ningún manejo de este caso en el texto std.

Actualización 1/2 (fusionada) Reenvié una solicitud al C++ Editores para investigar las cosas. Gracias Johannes por señalarme eso.

  • "void f(long) override" no anula una función, esp. no hay uno 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" override " 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 "override" se vuelve inútil.

La mejor solución posible puede ser

  • poner "virtual" delante de las funciones del ejemplo
Author: towi, 2011-09-23

3 answers

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

Sí, lo es. Porque en fin reemplazar algo, algo que tiene que ser virtual. De otra manera no primordial, es ocultar. Por lo tanto, la respuesta positiva se desprende de la cita en su pregunta.

 24
Author: Armen Tsirunyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-24 12:24:50

Si B:f no era virtual, entonces ambos D:f las funciones estarían mal formadas.

 0
Author: Branko Dimitrijevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 14:34:23

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

Generalmente, las funciones con diferentes firmas (sobrecargadas), son tan diferentes como las funciones con diferentes nombres. El ejemplo dado en la Especificación no pretende implicar que el nombre de la función tenga efectos override. Está destinado a mostrar el error común que override está diseñado para evitar.

 0
Author: deft_code,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 14:38:03