Funktionsnamenkollision bei der Vererbung abgeleiteter Klassen
Berücksichtigen Sie den folgenden Codeausschnitt:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {} }; class C : public B { public: void bar() { string s; foo(s); } };
Beim Kompilieren dieses Codes , generiert der Compiler den folgenden Fehler:
error: no matching function for call to 'C::foo(std::string&)' candidates are: int B::foo(int)
Dieser Fehler tritt auf wegen der Schattenfunktion des Funktionsnamens. Wenn die abgeleitete Klasse B eine Funktion mit demselben Namen wie eine Funktion in ihrer Basisklasse A definiert, überschattet die abgeleitete Klassenfunktion die Basisklassenfunktion.
Name Lookup Scope
Die Namenssuche in einem Klassenbereich folgt diesen Schritten:
Lösung
Um die Funktionsnamenkollision zu beheben, können Sie Folgendes tun Deklarieren Sie die Basisklassenfunktion im Bereich der abgeleiteten Klasse erneut. Dadurch wird sichergestellt, dass beide Funktionen innerhalb der abgeleiteten Klasse und ihrer Nachkommen sichtbar sind:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {}; using A::foo; }; class C : public B { public: void bar() { string s; foo(s); } };
Durch das Hinzufügen von using A::foo; geben Sie an, dass die foo-Funktion aus der Basisklasse A auch in der abgeleiteten Klasse verfügbar ist Klasse B. Jetzt wird der Code fehlerfrei kompiliert.
Zusätzliche Hinweise
"Die folgenden Schritte definieren das Ergebnis der Namenssuche im Klassenbereich C. Zuerst jede Deklaration für den Namen in der Klasse und in jeder ihrer Basis Ein Mitgliedsname f in einem Unterobjekt B verbirgt einen Mitgliedsnamen f in einem Unterobjekt A, wenn A ein Unterobjekt der Basisklasse ist B.“
Das obige ist der detaillierte Inhalt vonWie kann eine Funktionsnamenkollision bei der Vererbung abgeleiteter C-Klassen behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!