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!