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 ]