¿Puedo anular una función virtual con una virtual pura?
Tengo tres clases: B
, D
y G
. D
es un B
y G
es un 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 un 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 el comportamiento es parte del estándar o es indefinido y sucede que funciona hoy.
2 answers
Usted preguntó:
¿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 es pura. -nota final ]
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
2015-11-04 16:27:33
Si compila el código con un compilador más moderno, obtendrá 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 al Estándar entonces (10.3 Funciones virtuales)
11 Se definirá una función virtual declarada en una clase , o declarado puro (10.4) en esa clase, o ambas; pero no se requerido (3.2).
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
2015-11-04 16:25:01