Heim >Backend-Entwicklung >C++ >Wie kann ich Probleme beim Ausblenden von Funktionen beim Überladen von Funktionen in der C-Vererbung lösen?

Wie kann ich Probleme beim Ausblenden von Funktionen beim Überladen von Funktionen in der C-Vererbung lösen?

DDD
DDDOriginal
2025-01-02 17:39:44473Durchsuche

How Can I Resolve Function Hiding Issues When Overloading Functions in C   Inheritance?

Funktionsüberladung bei der Vererbung: Versteckte Funktionen verstehen

In der objektorientierten Programmierung ermöglicht die Vererbung, dass Klassen Eigenschaften und Methoden von übergeordneten Klassen erben. Wenn Sie jedoch Funktionen mit demselben Namen, aber unterschiedlichen Signaturen in Basis- und abgeleiteten Klassen definieren, kann die Namenssuche mehrdeutig werden, was zu Fehlern führt.

Problem:

Bedenken Sie Folgendes Folgender 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: member function not found
    }
};

Beim Versuch, die überschriebene foo-Funktion innerhalb der abgeleiteten Klasse C aufzurufen, stößt der Compiler auf ein Fehler, weil die Namenssuche bei der abgeleiteten Klasse B stoppt und das von der Basisklasse A geerbte foo nicht finden kann.

Lösung:

Um dieses Problem zu beheben, muss die Funktion von Die Basisklasse muss explizit im Gültigkeitsbereich der abgeleiteten Klasse mit dem Schlüsselwort using deklariert werden. Dadurch werden beide Funktionen innerhalb der abgeleiteten Klasse sichtbar.

class A
{
public:
    void foo(string s){};
};

class B : public A
{
public:
    int foo(int i){};
    using A::foo; // Re-declare function from base class
};

class C : public B
{
public:
    void bar()
    {
        string s;
        foo(s); // Now calls the inherited 'foo' function
    }
};

Erklärung:

Die Namenssuche bei der Vererbung ist hierarchisch. Standardmäßig priorisiert die Namenssuche Funktionen, die in der abgeleiteten Klasse definiert sind. Wenn im obigen Beispiel foo(s) in C aufgerufen wird, sucht der Compiler zunächst nach einer passenden Funktion in C, dann in B und schließlich in A. Da B jedoch über eine eigene foo-Funktion verfügt, stoppt die Suche dort. Dies führt zu dem Fehler.

Durch die explizite Deklaration der foo-Funktion der Basisklasse in B mithilfe von A::foo wird der Compiler angewiesen, bei der Namenssuche beide Funktionen zu berücksichtigen. Dadurch kann die geerbte Foo-Funktion von C aus gefunden und aufgerufen werden.

Im Wesentlichen löst diese Technik das Problem des Versteckens von Funktionen in abgeleiteten Klassen und stellt die korrekte Namenssuche sicher, wenn mit überladenen Funktionen in Vererbungshierarchien gearbeitet wird.

Das obige ist der detaillierte Inhalt vonWie kann ich Probleme beim Ausblenden von Funktionen beim Überladen von Funktionen in der C-Vererbung lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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