Überladene Funktionen mit Mehrfachvererbung
In C können durch Funktionsüberladung mehrere Funktionen mit demselben Namen innerhalb eines einzigen Bereichs definiert werden, vorausgesetzt Sie haben unterschiedliche Parameterlisten. Dieses Verhalten erstreckt sich jedoch nicht auf mehrfach geerbte Funktionen mit demselben Namen, aber unterschiedlichen Signaturen. Dies wirft die Frage auf: Warum werden solche Funktionen nicht als überladen behandelt?
Gemäß Abschnitt 10.2/2 des C-Standards schreiben die Suchregeln für Mitglieder vor, dass versteckte Deklarationen bei der Namenssuche nicht berücksichtigt werden. Wenn mehrere Basisklassen Funktionen mit demselben Namen, aber unterschiedlichen Parametern definieren, sind diese Funktionen möglicherweise voreinander verborgen. Wenn daher der resultierende Satz von Deklarationen nicht aus Unterobjekten desselben Typs besteht oder ein nicht statisches Mitglied und Mitglieder aus verschiedenen Unterobjekten enthält, entsteht eine Mehrdeutigkeit und das Programm wird als fehlerhaft betrachtet.
Zum Beispiel:
class A { public: int f(int); }; class B { public: int f(); }; class C : public A, public B {};
In diesem Fall ist f mehrdeutig, da es in zwei verschiedenen Basisklassen (A und B) definiert ist. Daher ist der folgende Aufruf von f aus der C-Klasse falsch:
int main() { C c; c.f(); // ambiguous }
Um diese Mehrdeutigkeit aufzulösen, können Sie die using-Deklaration verwenden, um anzugeben, welche Basisklasse die f-Funktion implementiert. Zum Beispiel:
class C : public A, public B { using A::f; using B::f; };
Mit dieser Änderung ruft c.f() nun explizit f aus Klasse A auf und löst so die Mehrdeutigkeit auf.
Im Gegensatz dazu funktioniert das zweite Codebeispiel, das Sie bereitgestellt haben, weil foo( float) wird im Bereich der Derived-Klasse definiert und nicht von mehreren Basisklassen geerbt. Daher ruft d.foo(5) die Funktion foo(float) direkt und ohne Mehrdeutigkeit auf.
Das obige ist der detaillierte Inhalt vonWarum unterstützt die Mehrfachvererbung keine überladenen Funktionen mit demselben Namen, aber unterschiedlichen Signaturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!