Maison > développement back-end > C++ > Pourquoi un appel de fonction virtuelle hérite-t-il de l'argument par défaut de la classe de base au lieu de la classe dérivée ?

Pourquoi un appel de fonction virtuelle hérite-t-il de l'argument par défaut de la classe de base au lieu de la classe dérivée ?

Patricia Arquette
Libérer: 2024-11-09 10:41:02
original
443 Les gens l'ont consulté

Why Does a Virtual Function Call Inherit the Default Argument from the Base Class Instead of the Derived Class?

Comportement des arguments par défaut des fonctions virtuelles : une énigme imprévue

Dans cet extrait de code, un dilemme se pose concernant le comportement des arguments par défaut des fonctions virtuelles :

class B {
public:
    B();
    virtual void print(int data = 10) {
        cout << endl << "B--data=" << data;
    }
};

class D : public B {
public:
    D();
    void print(int data = 20) {
        cout << endl << "D--data=" << data;
    }
};

int main() {
    B* bp = new D();
    bp->print();
    return 0;
}
Copier après la connexion

Résultat attendu :

[ D--data=20 ]
Copier après la connexion

Résultat réel :

[ D--data=10 ]
Copier après la connexion

Comprendre le Comportement :

La norme C dicte dans la section 8.3.6.10 que les arguments par défaut d'un appel de fonction virtuelle sont déterminés par le type statique du pointeur ou de la référence désignant l'objet. Dans ce cas, puisque la fonction print est invoquée via un pointeur de type B (bp), l'argument par défaut de B::print est utilisé, ce qui entraîne une sortie inattendue.

Conclusion :

Lors de l'appel de fonctions virtuelles via des pointeurs ou des références, le comportement de l'argument par défaut doit être soigneusement pris en compte. Le type statique du pointeur ou de la référence détermine quels arguments par défaut sont utilisés, ce qui peut conduire à des résultats inattendus s'ils ne sont pas correctement compris.

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