Heim >Backend-Entwicklung >C++ >Warum ist ein expliziter Methodenaufruf für überladene Methoden in abgeleiteten Klassen erforderlich?

Warum ist ein expliziter Methodenaufruf für überladene Methoden in abgeleiteten Klassen erforderlich?

DDD
DDDOriginal
2024-11-02 12:50:021063Durchsuche

Why is Explicit Method Invocation Required for Overloaded Methods in Derived Classes?

C-Überladungsauflösung: Explizite Methodenauswahl erforderlich

In C erfolgt die Überladungsauflösung basierend auf den Argumenttypen und den Bereichen, in denen eine Methode enthalten ist wird deklariert. Um eine genaue Methodenauswahl sicherzustellen, erfordern bestimmte Szenarien einen expliziten Methodenaufruf.

Betrachten Sie das folgende Beispiel:

<code class="cpp">class A {
  public:
    int DoSomething() { return 0; }
};

class B : public A {
  public:
    int DoSomething(int x) { return 1; }
};

int main() {
  B* b = new B();
  b->A::DoSomething(); // Why this?
  // b->DoSomething(); // Why not this? (Compiler error)
  delete b;
  return 0;
}</code>

Warum ist die Anweisung b->A::DoSomething(); notwendig?

Überlastungsauflösung verstehen:

In diesem Fall berücksichtigt der Compiler den Umfang der Methode, wenn er eine Überlastungsauflösung durchführt. Standardmäßig wird nur innerhalb des Gültigkeitsbereichs der aktuellen Klasse nach einer Methodenübereinstimmung gesucht. In Klasse B findet der Compiler DoSomething(int) innerhalb des aktuellen Bereichs, der ein einzelnes int-Argument akzeptiert.

Expliziter Aufruf erforderlich:

Allerdings die übergeordnete Klasse A deklariert außerdem eine Version von DoSomething(), die keine Argumente akzeptiert. Um auf diese Methode in der abgeleiteten Klasse B zuzugreifen, muss sie explizit mit dem Klassenbereichsoperator (A::) aufgerufen werden.

Die Anweisung b->DoSomething(); würde beim Kompilieren fehlschlagen, da der Compiler keine Methode namens DoSomething() ohne Argumente im Bereich der Klasse B finden kann. Es wird fälschlicherweise davon ausgegangen, dass DoSomething(int) die beabsichtigte Methode ist.

Lösungen:

Um dieses Problem zu beheben, besteht eine Lösung darin, die using-Deklaration in Klasse B einzuführen. Dadurch wird die DoSomething()-Methode aus der übergeordneten Klasse in den Bereich der abgeleiteten Klasse gezogen:

<code class="cpp">class B : public A {
public:
    using A::DoSomething;
    // …
};</code>

Mit dieser Änderung kann die Überladungsauflösung nun die gewünschte DoSomething()-Methode korrekt identifizieren, wodurch die Notwendigkeit eines expliziten Aufrufs mit b->A::DoSomething();.

entfällt

Das obige ist der detaillierte Inhalt vonWarum ist ein expliziter Methodenaufruf für überladene Methoden in abgeleiteten Klassen erforderlich?. 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