Tuve un problema frustrante recientemente que se redujo a un error de codificación muy simple. Considere el siguiente código:Advertencia por falta de palabra clave virtual
#include <iostream>
class Base
{
public:
void func() { std::cout << "BASE" << std::endl; }
};
class Derived : public Base
{
public:
virtual void func() { std::cout << "DERIVED" << std::endl; }
};
int main(int argc, char* argv[])
{
Base* obj = new Derived;
obj->func();
delete obj;
return 0;
}
La salida es
BASE
Obviamente (para este caso), que quería decir que poner la palabra clave virtual en base :: func por lo que se deriva :: func se llamaría en main. Me doy cuenta de que esto es (probablemente) permitido por el estándar de C++, y posiblemente con buenas razones, pero me parece que el 99% de las veces esto sería un error de codificación. Sin embargo, cuando compilé usando g ++ y todas las opciones de -Wblah que pude pensar, no se generaron advertencias.
¿Hay alguna manera de generar una advertencia cuando tanto una clase base como una derivada tienen funciones miembro del mismo nombre donde la función de la clase derivada es virtual y la función de la clase base no?
'delete' en el ejemplo no puede destruir' 'Derived' porque base' no tiene un destructor' virtual' –