In C ermöglichen virtuelle Funktionen abgeleiteten Klassen, die Implementierungen von in Basisklassen definierten Funktionen zu überschreiben. Das Standardargumentverhalten für virtuelle Funktionen kann jedoch verwirrend sein.
Problembeschreibung:
Bedenken Sie den folgenden Codeausschnitt:
class B { public: B(); virtual void print(int data=10) { cout << endl << "B--data=" << data; } }; class D:public B { public: D(); void print(int data=20) { cout << endl << "D--data=" << data; } }; int main() { B *bp = new D(); bp->print(); return 0; }
Erwartete Ausgabe:
[ D--data=20 ]
Tatsächliche Ausgabe:
[ D--data=10 ]
Erklärung:
Gemäß dem C-Standard (8.3.6.10) werden beim Aufruf einer virtuellen Funktion über einen Zeiger oder eine Referenz die Standardargumente von abgeleitet statischer Typ des Zeigers oder der Referenz, nicht die überschreibende Funktion der abgeleiteten Klasse.
In diesem Fall ist bp ein Zeiger vom Typ B, daher wird das Standardargument von B::print (das 10 ist) verwendet. Überschreiben des Standardarguments von D::print (das 20 ist).
Daher ist die Ausgabe D--data=10 anstelle des erwarteten D--data=20.
Das obige ist der detaillierte Inhalt vonWarum verwendet das Standardargument einer virtuellen Funktion den Wert der Basisklasse anstelle des Werts der abgeleiteten Klasse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!