Heim > Artikel > Backend-Entwicklung > Warum erbt ein virtueller Funktionsaufruf Standardargumente von der Basisklasse und nicht von der abgeleiteten Klasse?
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!