Heim > Backend-Entwicklung > C++ > Warum tritt bei der C-Vererbung „Funktion mit demselben Namen, aber unterschiedlicher Signatur in abgeleiteter Klasse nicht gefunden' auf?

Warum tritt bei der C-Vererbung „Funktion mit demselben Namen, aber unterschiedlicher Signatur in abgeleiteter Klasse nicht gefunden' auf?

Mary-Kate Olsen
Freigeben: 2024-12-21 03:40:09
Original
744 Leute haben es durchsucht

Why Does

Ausblenden von Funktionen in Klassenhierarchien: Verständnis des Fehlers „Funktion mit demselben Namen, aber unterschiedlicher Signatur in abgeleiteter Klasse nicht gefunden“

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

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

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!

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