Les fonctions virtuelles peuvent-elles avoir des paramètres par défaut ?
Problème :
Lors de la déclaration d'une fonction virtuelle avec des paramètres par défaut dans une classe de base, les classes dérivées en héritent-elles valeurs par défaut ?
Réponse :
Non, les valeurs par défaut des fonctions virtuelles ne sont pas héritées par les classes dérivées. La valeur par défaut utilisée est déterminée par le type statique de l'objet lorsque la fonction est appelée.
Explication :
Les normes C (C 03 et C 11) précisent que les appels de fonction virtuelle utilisent les arguments par défaut déclarés dans la définition de fonction déterminés par le type statique du pointeur ou de la référence utilisé pour appeler le fonction.
Exemple :
Considérez le code suivant :
struct Base { virtual void f(int a = 7); }; struct Der : public Base { void f(int a); };
Lors de l'appel de f() via un pointeur vers un objet de base, le la valeur par défaut 7 sera utilisée :
Base* pb = new Base; pb->f(); // uses the default 7
Cependant, lors de l'appel de f() via un pointeur vers un objet Der, le dérivé la valeur par défaut de la classe ne sera pas utilisée :
Der* pd = new Der; pd->f(); // error: no default argument for this function
Considérations pratiques et du compilateur :
Bien que les normes C dictent le comportement, certains compilateurs peuvent implémenter les paramètres par défaut des fonctions virtuelles différemment . Cependant, il est recommandé de suivre les directives de la norme pour garantir un comportement cohérent entre les compilateurs.
Démonstration de code :
Le code suivant illustre le comportement du paramètre par défaut :
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; }
Sortie :
Base 42 Der 42 Der 84
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!