Maison  >  Article  >  développement back-end  >  Comment se comportent les arguments par défaut dans les fonctions virtuelles en C ?

Comment se comportent les arguments par défaut dans les fonctions virtuelles en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 10:12:02248parcourir

How do Default Arguments Behave in Virtual Functions in C  ?

Comportement de l'argument par défaut de la fonction virtuelle

En C, les fonctions virtuelles fournissent un mécanisme de polymorphisme. Cependant, le comportement des arguments par défaut dans les fonctions virtuelles peut prêter à confusion.

Considérez le code suivant :

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

Lorsque vous exécutez ce code, vous pouvez vous attendre à ce que le résultat soit :

D--data=20

Cependant, le résultat réel est :

D--data=10

Explication :

La raison de ce comportement inattendu réside dans la norme C (8.3 .6.10), qui stipule qu'un appel de fonction virtuelle utilise les arguments par défaut dans la déclaration de la fonction virtuelle déterminés par le type statique du pointeur ou de la référence désignant l'objet. Dans ce cas, puisque vous appelez print() via un pointeur de type B (c'est-à-dire bp), l'argument par défaut de B::print() est utilisé, même si la fonction remplacée dans la classe dérivée D a une valeur par défaut différente. argument.

Par conséquent, lors de l'appel d'une fonction virtuelle via un pointeur ou une référence de classe de base, les arguments par défaut de la fonction de classe de base, et non la fonction remplacée, sont appliqués. Ce comportement est important à comprendre pour éviter toute confusion ou résultats inattendus lorsque vous travaillez avec des fonctions virtuelles et des arguments par défaut.

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