virtuales que puro polimorfismo objeto modificador herencia funciones c++ c++11 virtual language-lawyer pure-virtual

puro - que es un objeto en c++



¿Puedo anular una función virtual con una virtual pura? (2)

Tengo tres clases: B , D y G D es una B y G es una D Tanto B como D son abstractos. B es de un tercero.

B tiene un método virtual no puro que G necesita implementar (para ser una D ). ¿Puedo y es una buena práctica redefinir / anular una función virtual para que sea pura virtual?

Ejemplo:

class B // from a third party { public: virtual void foo(); }; class D : public B { public: void foo() override = 0; // allowed by gcc 4.8.2 virtual void bar() = 0; }; class G : public D { public: // forgot to reimplement foo void bar() override; }; int main() { G test; // compiler error is desired }

A la pregunta de "¿puedo?" gcc lo permite, pero no tengo los términos / vocabulario para verificar que el comportamiento sea parte de la norma o no esté definido y que funcione hoy.


Si compilas el código con un compilador más moderno, obtendrás los siguientes mensajes de error que explican el problema

prog.cc:23:6: error: variable type ''G'' is an abstract class G test; // compiler error is desired ^ prog.cc:10:9: note: unimplemented pure virtual method ''foo'' in ''G'' void foo() override = 0; // allowed by gcc 4.8.2 ^ 1 error generated.

En cuanto a la norma entonces (10.3 funciones virtuales)

11 Una función virtual declarada en una clase se definirá, o se declarará pura (10.4) en esa clase, o ambas; pero no se requiere diagnóstico (3.2).


Tu preguntaste:

¿Puedo anular una función virtual con una virtual pura?

La respuesta es: sí, puedes. Del estándar C ++ 11:

10.4 clases abstractas

5 [ Nota: una clase abstracta puede derivarse de una clase que no es abstracta, y una función virtual pura puede anular una función virtual que no sea pura. - nota final ]