Heim >Backend-Entwicklung >C++ >Erben Standardparameter in virtuellen Funktionen an abgeleitete Klassen?

Erben Standardparameter in virtuellen Funktionen an abgeleitete Klassen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-26 14:15:11201Durchsuche

Do Default Parameters in Virtual Functions Inherit to Derived Classes?

Können virtuelle Funktionen Standardparameter haben?

Problem:

Bei der Deklaration einer virtuellen Funktion Erben abgeleitete Klassen mit Standardparametern in einer Basisklasse diese? Standardwerte?

Antwort:

Nein, Standardwerte in virtuellen Funktionen werden nicht von abgeleiteten Klassen geerbt. Der verwendete Standard wird durch den statischen Typ des Objekts beim Aufruf der Funktion bestimmt.

Erklärung:

Die C-Standards (C 03 und C 11) legen dies fest Virtuelle Funktionsaufrufe verwenden die in der Funktionsdefinition deklarierten Standardargumente, die durch den statischen Typ des Zeigers oder der Referenz bestimmt werden, die zum Aufrufen verwendet wird Funktion.

Beispiel:

Betrachten Sie den folgenden Code:

struct Base {
  virtual void f(int a = 7);
};
struct Der : public Base {
  void f(int a);
};

Wenn Sie f() über einen Zeiger auf ein Basisobjekt aufrufen, wird die Standard 7 wird verwendet:

Base* pb = new Base;
pb->f(); // uses the default 7

Wenn jedoch f() über einen Zeiger auf ein Der-Objekt aufgerufen wird, wird das abgeleitete Der Standardwert der Klasse wird nicht verwendet:

Der* pd = new Der;
pd->f(); // error: no default argument for this function

Überlegungen zur Praxis und zum Compiler:

Während die C-Standards das Verhalten vorschreiben, implementieren einige Compiler möglicherweise die Standardparameter virtueller Funktionen anders . Es wird jedoch empfohlen, die Richtlinien des Standards zu befolgen, um ein konsistentes Verhalten über alle Compiler hinweg sicherzustellen.

Code-Demonstration:

Der folgende Code demonstriert das Standardparameterverhalten:

struct Base { virtual string Speak(int n = 42); };
struct Der : public Base { string Speak(int n = 84); };

int main()
{
    Base b1;
    Der d1;

    Base *pb1 = &b1, *pb2 = &d1;
    Der *pd1 = &d1;
    cout << pb1->Speak() << "\n" // Base 42
         << pb2->Speak() << "\n" // Der 42
         << pd1->Speak() << "\n" // Der 84
         << endl;
}

Ausgabe:

Base 42
Der 42
Der 84

Das obige ist der detaillierte Inhalt vonErben Standardparameter in virtuellen Funktionen an abgeleitete Klassen?. 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