Maison >développement back-end >C++ >Les paramètres par défaut des fonctions virtuelles héritent-ils des classes dérivées ?

Les paramètres par défaut des fonctions virtuelles héritent-ils des classes dérivées ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-26 14:15:11201parcourir

Do Default Parameters in Virtual Functions Inherit to Derived Classes?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn