clang gibt beim Kompilieren des folgenden Codes eine Warnung aus:
struct Base
{
virtual void * get(char* e);
// virtual void * get(char* e, int index);
};
struct Derived: public Base {
virtual void * get(char* e, int index);
};
Die Warnung lautet:
warning: 'Derived::get' hides overloaded virtual function [-Woverloaded-virtual]
(Diese Warnung muss natürlich aktiviert sein).
Ich verstehe nicht warum. Beachten Sie, dass das Kommentieren derselben Deklaration in Base die Warnung beendet. Mein Verständnis ist, dass es kein Verstecken geben kann, da die beiden Funktionen get () unterschiedliche Signaturen haben.
Ist Klirren richtig? Warum?
Beachten Sie, dass dies unter MacOS X erfolgt und eine aktuelle Version von Xcode ausgeführt wird.
clang --version
Apple LLVM version 5.0 (clang-500.1.74) (based on LLVM 3.3svn)
Update: Gleiches Verhalten mit Xcode 4.6.3.
get
Funktionselement jetzt mit einem einzelnen Argument für ein Objekt vom statischen Typ aufrufenDerived
. Ohne die using-Deklaration würde dasselbe zu einem Kompilierungsfehler führen.Eine andere Möglichkeit, die Warnung zu deaktivieren und die öffentliche Struktur der Struktur intakt zu halten, wäre:
struct Derived: public Base { virtual void * get(char* e, int index); private: using Base::get; };
Dadurch kann ein Verbraucher nicht
Derived
anrufen,Derived::get(char* e)
während die Warnung stummgeschaltet wird:Derived der; der.get("", 0); //Allowed der.get(""); //Compilation error
quelle
get
!Die Lösung von R. Martinho Fernandes ist absolut gültig, wenn Sie die
get()
Methode tatsächlich mit einem einzelnen char * -Argument einbringen möchtenDerived
Geltungsbereich .In dem von Ihnen bereitgestellten Snippet sind keine virtuellen Methoden erforderlich (da Base und Derived keine Methode mit derselben Signatur gemeinsam nutzen).
Unter der Annahme, dass tatsächlich Polymorphismus erforderlich ist, könnte das Versteckverhalten dennoch das sein, was beabsichtigt ist. In diesem Fall ist es möglich, Clangs Warnung mit folgendem Pragma lokal zu deaktivieren:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Woverloaded-virtual" // Member declaration raising the warning. #pragma clang diagnostic pop
quelle
const
die geerbte Methode vergessen hatte und das Klirren die ganze Zeit richtig war. Vertrauen Sie im Zweifelsfall dem Compiler. Wenn Sie am Compiler zweifeln, vertrauen Sie dem Compiler. :) +1 für beide, die mir beide geben, was ich gesucht und gebraucht habe!Warnung bedeutet, dass im Bereich der abgeleiteten Klasse keine void * get (char * e) -Funktion vorhanden ist, da diese von einer anderen Methode mit demselben Namen ausgeblendet wird. Der Compiler sucht nicht nach Funktionen in Basisklassen, wenn die abgeleitete Klasse mindestens eine Methode mit dem angegebenen Namen hat, selbst wenn sie andere Argumente hat.
Dieser Beispielcode wird nicht kompiliert:
class A { public: virtual void Foo() {} }; class B : public A { public: virtual void Foo(int a) {} }; int main() { B b; b.Foo(); return 0; }
quelle
b.Foo();
. Sie müssen nur schreibenb.A::Foo();
.