Heim >Backend-Entwicklung >C++ >Warum ist ein expliziter Methodenaufruf für überladene Methoden in abgeleiteten Klassen erforderlich?
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älltDas 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!