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
Libérer: 2024-11-26 14:15:11
original
189 Les gens l'ont consulté

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);
};
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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;
}
Copier après la connexion

Sortie :

Base 42
Der 42
Der 84
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal