Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verwendet das Standardargument einer virtuellen Funktion den Basisklassenwert?

Warum verwendet das Standardargument einer virtuellen Funktion den Basisklassenwert?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 16:57:01431Durchsuche

Why Does the Default Argument of a Virtual Function Use the Base Class Value?

Unerwartetes Standardargumentverhalten in virtuellen Funktionen: Die Grundursache verstehen

In diesem Codeausschnitt stoßen Sie auf ein interessantes Problem im Zusammenhang mit der Standardeinstellung Argumente virtueller Funktionen. Obwohl Sie erwarten, dass die Ausgabe „D--data=20“ ist, beobachten Sie stattdessen „D--data=10“. Lassen Sie uns den internen Mechanismus untersuchen, um die Grundursache zu verstehen.

In Ihrem Beispiel haben Sie zwei Klassen, B und D, mit einer virtuellen Funktion namens print, die ein Standardargument akzeptiert. In Klasse D überschreiben Sie die Druckfunktion und geben ein anderes Standardargument an. Wenn Sie eine Instanz von D erstellen, greifen Sie über einen Zeiger auf B auf die Druckfunktion zu.

Gemäß dem C-Standard (8.3.6.10) „verwendet ein virtueller Funktionsaufruf die Standardargumente in der Deklaration von virtuelle Funktion, die durch den statischen Typ des Zeigers oder der Referenz bestimmt wird, die das Objekt bezeichnet.“ Dies bedeutet, dass beim Aufrufen einer virtuellen Funktion über einen Zeiger auf eine Basisklasse die in der Deklaration der Basisklasse definierten Standardargumente verwendet werden, unabhängig von den überschriebenen Standardargumenten in der abgeleiteten Klasse.

Daher gilt, wenn Sie aufrufen Beim Drucken über den Zeiger bp wird das Standardargument durch den statischen Typ von bp bestimmt, der B ist. Folglich wird das Standardargument B::print verwendet, was stattdessen zur Ausgabe von „D--data=10“ führt der erwarteten „D--data=20.“

Das obige ist der detaillierte Inhalt vonWarum verwendet das Standardargument einer virtuellen Funktion den Basisklassenwert?. 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