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; }
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; };
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!