¿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.

Author: Columbo, 2015-11-04

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 ]

 23
Author: R Sahu,
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).

 2
Author: Vlad from Moscow,
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