Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verwendet das Standardargument einer virtuellen Funktion den Wert der Basisklasse anstelle des Werts der abgeleiteten Klasse?

Warum verwendet das Standardargument einer virtuellen Funktion den Wert der Basisklasse anstelle des Werts der abgeleiteten Klasse?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 22:00:03818Durchsuche

Why Does a Virtual Function's Default Argument Use the Base Class's Value Instead of the Derived Class's?

Grundlegendes zum Standardargumentverhalten virtueller Funktionen

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!

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