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!