Ü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 Member-Lookup-Regeln 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) definiert ist innerhalb des Bereichs der Derived-Klasse und wird nicht von mehreren Basisklassen geerbt. Daher ruft d.foo(5) die Funktion foo(float) direkt und ohne Mehrdeutigkeit auf.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3