Heim > Backend-Entwicklung > C++ > Warum unterstützt die Mehrfachvererbung keine überladenen Funktionen mit demselben Namen, aber unterschiedlichen Signaturen?

Warum unterstützt die Mehrfachvererbung keine überladenen Funktionen mit demselben Namen, aber unterschiedlichen Signaturen?

DDD
Freigeben: 2024-12-08 08:00:22
Original
1006 Leute haben es durchsucht

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

Ü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 {};
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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;
};
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage