Heim > Backend-Entwicklung > C++ > Wie kann eine Funktionsnamenkollision bei der Vererbung abgeleiteter C-Klassen behoben werden?

Wie kann eine Funktionsnamenkollision bei der Vererbung abgeleiteter C-Klassen behoben werden?

Patricia Arquette
Freigeben: 2024-12-30 13:40:16
Original
631 Leute haben es durchsucht

How to Resolve Function Name Collision in C   Derived Class Inheritance?

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); } };
Nach dem Login kopieren

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)
Nach dem Login kopieren

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:

  1. Berücksichtigen Sie alle Deklarationen für den Namen in der Klasse und ihrer Basis Klassen.
  2. Entfernen Sie alle durch andere Deklarationen in Basisklassen verborgenen Deklarationen.

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); } };
Nach dem Login kopieren

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

  • Der Standard definiert Namenssuche im Klassenbereich wie folgt:
"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.“
  • Die Namenssuche erfolgt vor der Zugriffskontrolle. Selbst wenn die foo-Funktion in B privat ist, wird die foo-Funktion in A daher immer noch nicht gefunden.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage