Maison >développement back-end >C++ >Pourquoi les fonctions virtuelles appelées dans un constructeur renvoient-elles l'implémentation de la classe de base ?

Pourquoi les fonctions virtuelles appelées dans un constructeur renvoient-elles l'implémentation de la classe de base ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 11:48:34361parcourir

Why Do Virtual Functions Called in a Constructor Return the Base Class Implementation?

Pourquoi les fonctions virtuelles ne peuvent pas être appelées à partir de constructeurs

En C, les fonctions virtuelles jouent un rôle crucial dans le polymorphisme en activant les objets de dérivé classes pour remplacer les méthodes héritées de leurs classes de base. Cependant, une idée fausse courante surgit lorsque l'on tente d'appeler des fonctions virtuelles à partir de constructeurs de classe.

Considérez l'exemple de code suivant :

struct base {
   virtual const int value() const {
      return 0;
   }
   base() {
      std::cout << value() << std::endl;
   }
   virtual ~base() {}
};

struct derived : public base {
   virtual const int value() const {
      return 1;
   }
};

int main(void) {
   derived example;
}

Lorsque ce code s'exécute, il génère "0" au lieu de le "1" attendu. Pourquoi ?

La raison réside dans l'ordre d'exécution du constructeur. Lorsqu'un objet de classe dérivée est créé, le constructeur de classe de base est appelé en premier. À ce stade, l'objet de classe dérivé n'est pas encore entièrement construit et ses méthodes virtuelles ne peuvent pas être appelées de manière fiable.

Lorsque le constructeur de classe de base appelle value(), il accède à l'implémentation de classe de base de la fonction virtuelle car la classe dérivée n'a pas encore « mûri » en un objet dérivé. Pour garantir que les fonctions virtuelles sont appelées correctement, elles doivent être accessibles à partir d'objets entièrement construits.

Par conséquent, pour corriger le code et afficher "1", l'appel de la méthode value() dans le constructeur de la classe de base doit être retiré ou reporté jusqu'à ce que l'objet soit entièrement construit.

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