gcc-Woverloaded-virtual-Warnungen
Den folgenden C++ - code, den ich denke, ist richtig, aber produzieren einige Warnungen bei der Kompilierung mit "-Woverloaded-virtual" ist die Warnung falsch oder es gibt ein echtes problem mit diesem code?
Wenn, dass ist eine gefälschte Warnung, was kann ich tun um es zu vermeiden, definieren Sie die Ausnahme virtuellen Varianten abgeleitet get befreit von der Warnung, aber vielleicht ist eine bessere Lösung
G++ - Befehl:
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++ - code
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");
}
};
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Warnung bedeutet, dass:
Wenn Sie nicht mit dynamischen dispatch dann Ihre
derived
class-Objekt kann nur aufrufen,und es zu verstecken alle gleichnamigen Methoden aus der Basisklasse
intermediate
.In Ordnung, dass Ihr Objekt abgeleitete Klasse kann alle rufen die gleichnamigen Methoden in der Basis-Klasse
intermediate
zu können, müssen Sie die folgende Zeile zu Ihrerderived
Klasse.Natürlich, Sie sind in der besten position, um zu entscheiden, ob dies ein problem ist oder nicht.
void exception(const char* msg) = delete;
funktionieren würde. EDIT: Nein, das löschen einer überlastung wie, dass ist ein Fehler. Aber ich wäre überrascht, wenn das war eigentlich immer absichtlich, in gut entwickelte code; Sie sollten in der Lage sein zu behandeln, eine Instanz von einer abgeleiteten Klasse wie eine Instanz der Basis-Klasse.private
gut.Wird die Warnung aufgrund der Tatsache, dass Sie nicht nennen
derived::exception(const char*)
auf ein Objekt vom Typderived
(oder durch einen Zeiger aufderived
), auch wenn die Eltern-Klasse definiert, und es ist virtuell (also würde man erwarten, dass es inderived
). Die Warnung entfernen, die Sie benötigen, zu entlarven, dass die Funktion inderived
:Oder wenn Sie nicht möchten, setzen Sie es keinen anderen, deklarieren Sie es als privat, mit keine defintion.
UPDATE: Nach der überprüfung (und wie bereits von der Als) die using-Direktive, werden Sie dies auch tun können:
using intermediate::exception;
.Bitte die Funktion neu definieren:
virtual void exception(const char* msg);
in der Klasse "abgeleitet".Nun Ihr code wird kompiliert ohne warnings.