Heim > Backend-Entwicklung > C++ > Wie werden mehrere geerbte Funktionen mit identischen Namen, aber unterschiedlichen Signaturen in C aufgelöst?

Wie werden mehrere geerbte Funktionen mit identischen Namen, aber unterschiedlichen Signaturen in C aufgelöst?

Susan Sarandon
Freigeben: 2024-12-14 00:04:14
Original
550 Leute haben es durchsucht

How Do Multiple Inherited Functions with Identical Names but Different Signatures Resolve in C  ?

Mehrere geerbte Funktionen mit derselben Signatur werden nicht überladen

In der objektorientierten Programmierung ermöglicht die Vererbung, dass Klassen Eigenschaften und Methoden von übergeordneten Klassen erben. Ein häufiges Problem tritt jedoch auf, wenn mehrere geerbte Klassen Funktionen mit demselben Namen, aber unterschiedlichen Signaturen haben.

Problem

Bedenken Sie den folgenden Codeausschnitt:

#include <iostream>

struct Base1 {
    void foo(int);
};

struct Base2 {
    void foo(float);
};

struct Derived : public Base1, public Base2 {
};

int main() {
    Derived d;
    d.foo(5); // Ambiguous call to "foo"

    std::cin.get();
    return 0;
}
Nach dem Login kopieren

Dieser Code erzeugt den Fehler „mehrdeutiger Aufruf von foo“, der darauf hinweist, dass der Aufruf von foo nicht aufgelöst werden kann, da es mehrere gibt Geerbte Funktionen mit demselben Namen, aber unterschiedlichen Signaturen.

Erklärung

Gemäß C-Member-Suchregeln, wenn eine Klasse von mehreren Basisklassen erbt und es mehrere Deklarationen dafür gibt Wenn Sie denselben Namen verwenden, werden alle versteckten Deklarationen entfernt. Wenn der resultierende Satz von Deklarationen von unterschiedlichen Typen ist oder nichtstatische Mitglieder aus verschiedenen Basisklassen enthält, tritt eine Mehrdeutigkeit auf.

Im obigen Beispiel definieren sowohl Base1 als auch Base2 eine foo-Funktion, aber sie haben unterschiedliche Signaturen. Wenn Derived von Base1 und Base2 erbt, gibt es zwei unterschiedliche Deklarationen für foo mit unterschiedlichen Typen. Dies führt zu Mehrdeutigkeiten, die den Kompilierungsfehler verursachen.

Lösung

Um die Mehrdeutigkeit aufzulösen, können Sie Using-Deklarationen verwenden, um anzugeben, welche Version von foo der Basisklasse verwendet werden soll. Zum Beispiel:

class Derived : public Base1, public Base2 {
    using Base1::foo;
};
Nach dem Login kopieren

Diese using-Deklaration stellt sicher, dass die foo-Funktion von Base1 in Derived verwendet wird.

Gotcha

Beachten Sie, dass in der Im zweiten Codeausschnitt, den Sie bereitgestellt haben, verfügt die Derived-Klasse nur über eine foo-Funktion (mit einem Float-Parameter). Dies liegt daran, dass die foo-Funktion von Base1 durch die foo-Funktion von Derived ausgeblendet wird. Daher ruft d.foo(5) die foo-Funktion mit einem Float-Parameter von Derived und nicht von Base1 auf.

Um die Frage im Titel zu beantworten: Mehrere geerbte Funktionen mit demselben Namen, aber unterschiedlichen Signaturen sind dies nicht werden als überladene Funktionen behandelt, da dies zu Mehrdeutigkeiten führen würde. Stattdessen erfordert der Compiler eine explizite Auflösung mithilfe von Deklarationen oder anderen Techniken, um anzugeben, welche Funktion verwendet werden soll.

Das obige ist der detaillierte Inhalt vonWie werden mehrere geerbte Funktionen mit identischen Namen, aber unterschiedlichen Signaturen in C aufgelöst?. 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