Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erbt ein virtueller Funktionsaufruf Standardargumente von der Basisklasse und nicht von der abgeleiteten Klasse?

Warum erbt ein virtueller Funktionsaufruf Standardargumente von der Basisklasse und nicht von der abgeleiteten Klasse?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 11:46:02449Durchsuche

Why Does a Virtual Function Call Inherit Default Arguments from the Base Class Instead of the Derived Class?

Verhalten von Standardargumenten virtueller Funktionen

Im bereitgestellten C-Code entsteht eine merkwürdige Situation mit der Überladung virtueller Funktionen und Standardargumenten. Lassen Sie uns das Problem untersuchen und den zugrunde liegenden Mechanismus verstehen.

Der Code definiert zwei Klassen, B und D, wobei B eine virtuelle Druckmethode mit einem Standardargument von 10 hat und D print mit einem anderen Standardargument von 20 überschreibt Beim Aufruf von print über einen Zeiger vom Typ B, der auf ein Objekt vom Typ D zeigt, wird die erwartete Ausgabe von „D--data=20“ nicht erhalten. Stattdessen zeigt die Ausgabe „D--data=10“ an.

Gemäß dem C-Standard (8.3.6.10) verwendet ein virtueller Funktionsaufruf die in der Deklaration definierten Standardargumente, die durch die Statik des Zeigers oder der Referenz bestimmt werden Typ. Dies bedeutet, dass, wenn print über einen B-Zeiger aufgerufen wird, das Standardargument von B erbt, obwohl es in D überschrieben wird.

Die Erklärung liegt im statischen Typ (B) des Zeigers, der den Standard bestimmt Argument, das während des virtuellen Funktionsaufrufs verwendet wird. Auch wenn das Objekt, auf das gezeigt wird, vom Typ D ist, bestimmt der Typ des Zeigers das Standardargumentverhalten.

Daher wird der Zeiger zum Aufrufen von print verwendet, um die gewünschte Ausgabe „D--data=20“ zu erhalten muss vom Typ D sein, um die Verwendung des überschriebenen Standardarguments sicherzustellen.

Das obige ist der detaillierte Inhalt vonWarum erbt ein virtueller Funktionsaufruf Standardargumente von der Basisklasse und nicht von der abgeleiteten Klasse?. 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