Heim >Backend-Entwicklung >C++ >Warum werden in C nicht mehrere geerbte Funktionen mit demselben Namen überladen?

Warum werden in C nicht mehrere geerbte Funktionen mit demselben Namen überladen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-21 16:17:09608Durchsuche

Why Don't Multiple Inherited Functions with the Same Name Overload in C  ?

Mehrere geerbte Funktionen mit demselben Namen: Warum nicht überladen?

In C, wenn mehrere Klassen Funktionen mit demselben Namen, aber unterschiedlichen Signaturen erben , behandelt der Compiler diese Funktionen als eigenständige Member und nicht als überladene Funktionen. Dies führt zu Mehrdeutigkeiten beim Aufrufen der Funktionen aus einer abgeleiteten Klasse.

Betrachten Sie das folgende Beispiel:

struct Base1 {
  void foo(int);
};

struct Base2 {
  void foo(float);
};

struct Derived : public Base1, public Base2 {
};

Hier definieren sowohl Base1 als auch Base2 eine Funktion namens foo mit unterschiedlichen Parametern. Beim Aufruf von d.foo(5) aus der abgeleiteten Klasse Derived löst der Compiler einen „mehrdeutigen Aufruf“-Fehler aus.

Im Gegensatz zum Überschreiben, bei dem die Funktionssignaturen identisch sein müssen, ermöglicht das Überladen Funktionen mit demselben Namen, aber verschiedene Parameter. Diese Regel gilt jedoch nicht für mehrere geerbte Funktionen.

Wenn in einer abgeleiteten Klasse mehrere Deklarationen desselben Mitgliedsnamens vorhanden sind, gelten gemäß den Suchregeln für C-Member die Deklarationen verschiedener Basisklassen als mehrdeutig. Dies tritt auf, wenn entweder die Deklarationen nicht alle von Unterobjekten desselben Typs stammen oder wenn ein nicht statisches Mitglied aus unterschiedlichen Unterobjekten vorhanden ist.

Um diese Mehrdeutigkeit aufzulösen, können Sie die using-Deklaration zur expliziten Angabe verwenden welche Funktion der Basisklasse aufgerufen werden soll:

struct Derived : public Base1, public Base2 {
  using Base1::foo;
  using Base2::foo;
};

int main() {
  Derived d;
  d.foo(5); // Calls Base1::foo(int)
  d.foo(5.0f); // Calls Base2::foo(float)
}

Im zweiten Code-Snippet vorausgesetzt:

struct Base {
  void foo(int);
};

struct Derived : public Base {
  void foo(float);
};

Die Funktion foo(float) in Derived überschreibt die Funktion foo(int) in der Basisklasse. Daher wird beim Aufruf von d.foo(5) die Funktion foo(float) korrekt und ohne Mehrdeutigkeit aufgerufen.

Das obige ist der detaillierte Inhalt vonWarum werden in C nicht mehrere geerbte Funktionen mit demselben Namen überladen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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