Maison  >  Article  >  développement back-end  >  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
Patricia Arquetteoriginal
2024-11-09 10:41:02395parcourir

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;
}

Résultat attendu :

[ D--data=20 ]

Résultat réel :

[ D--data=10 ]

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!

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