what c++ gcc virtual-functions overloading

c++ - what - gcc Woverloaded-virtual advertencias



c++ virtual keyword (3)

La advertencia se debe al hecho de que no se puede llamar a derived::exception(const char*) en un objeto de tipo derived (o mediante un puntero a derived ), aunque la clase principal lo defina y sea virtual (por lo que lo haría). esperar que esté disponible en derived ). Para eliminar la advertencia, debe exponer esa función miembro en derived :

class derived : public intermediate { public: virtual void exception(const char* msg) {intermediate::exception(msg);} virtual void exception() { intermediate::exception("derived:unknown exception"); } };

O si no desea exponerlo a otros, declare que es privado sin definición.

class derived : public intermediate { public: virtual void exception() { intermediate::exception("derived:unknown exception"); } private: void exception(const char* tmp); };

ACTUALIZACIÓN: Después de verificar dos veces (y como lo señala Als) la directiva de uso, también puede hacer esto:

class derived : public intermediate { public: using intermediate::exception; // imports both declarations from intermediate virtual void exception() // will not clash with the imported declaration of the // same signature, but properly overriders the parent // class''s defition { intermediate::exception("derived:unknown exception"); } };

El siguiente código de C ++ creo que es correcto, pero produce algunas advertencias cuando se compila con "-Woverloaded-virtual", ¿es la advertencia falsa o hay un problema real con este código?

Si se trata de una advertencia falsa, ¿qué puedo hacer para evitarla? Defina todas las variantes virtuales de excepción en las derivaciones de obtención de la advertencia, pero tal vez sea una mejor solución.

Comando G ++:

g++ -c -Woverloaded-virtual test.cpp test.cpp:22:18: warning: ‘virtual void intermediate::exception(const char*)’ was hidden [-Woverloaded-virtual] test.cpp:32:18: warning: by ‘virtual void derived::exception()’ [-Woverloaded-virtual]

Código C ++

using namespace std; class base { public: virtual void exception() = 0; virtual void exception(const char*) = 0; }; class intermediate : public base { public: virtual void exception() { cerr << "unknown exception" << endl; } virtual void exception(const char* msg) { cerr << "exception: " << msg << endl; } }; class derived : public intermediate { public: virtual void exception() { intermediate::exception("derived:unknown exception"); } };


La advertencia significa que:
Cuando no está utilizando el envío dinámico, entonces su objeto de clase derived solo puede llamar,

void exception()

y ocultará todos los métodos con el mismo nombre del intermediate clase Base.

Para que su objeto de clase derivada pueda llamar a todos los mismos métodos nombrados en el intermediate clase base, debe agregar la siguiente línea a su clase derived .

using intermediate::exception;

Por supuesto, usted está en la mejor posición para decidir si esto es un problema o no.


Por favor redefine la función:

virtual void exception(const char* msg); en la clase "derivada".

Ahora su código se compilará sin ninguna advertencia.