In der objektorientierten Programmierung können abgeleitete Klassen erben Mitglieder aus ihren Basisklassen. Allerdings können Probleme auftreten, wenn Funktionen mit demselben Namen, aber unterschiedlichen Signaturen sowohl in der Basisklasse als auch in der abgeleiteten Klasse vorhanden sind. Dies kann zu Fehlern wie „Funktion mit demselben Namen, aber unterschiedlicher Signatur in abgeleiteter Klasse nicht gefunden“ führen.
Um dieses Problem zu veranschaulichen, betrachten 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); // Error: no matching function } };
Beim Kompilieren In diesem Code stößt der Compiler auf einen Fehler im Aufruf von foo(s) innerhalb der Funktion bar() der Klasse C. Obwohl die Funktion foo(string s) in der Basisklasse A vorhanden ist, schlägt der Compiler fehl Erkennen Sie es aufgrund eines Phänomens, das als Funktionsverstecken bekannt ist.
In diesem Szenario verbirgt die in Klasse B definierte Funktion foo(int i) die von Klasse A geerbte Funktion foo(string s). Dies liegt daran, dass die Namenssuche in Klassenhierarchien bei der ersten Deklaration eines passenden Namens stoppt. Wenn der Suchprozess also Klasse B erreicht, findet er die Funktion foo(int i) und ignoriert die überschriebene Funktion foo(string s) in der Basisklasse.
Um dieses Problem zu beheben, muss die Funktion explizit neu deklariert werden Basisklassenfunktion im Bereich der abgeleiteten Klasse. Durch die Verwendung des Schlüsselworts using zum Erben der Basisklassenfunktion werden beide Funktionen innerhalb der abgeleiteten Klasse und ihrer Unterklassen sichtbar:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {} using A::foo; // Redeclare base class foo function }; class C : public B { public: void bar() { string s; foo(s); // Now finds the base class foo(string s) } };
Durch die Einbindung dieser Zeile in Klasse B berücksichtigt die Namenssuche korrekt beide foo( int i) und foo(string s)-Funktionen, wodurch das Problem mit dem Ausblenden von Funktionen behoben wird.
Das obige ist der detaillierte Inhalt vonWarum tritt bei der C-Vererbung „Funktion mit demselben Namen, aber unterschiedlicher Signatur in abgeleiteter Klasse nicht gefunden' auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!