Maison >développement back-end >C++ >Pourquoi l'appel d'une fonction virtuelle dans un constructeur de classe de base imprime-t-il la valeur de la classe de base, et non la valeur de la classe dérivée ?

Pourquoi l'appel d'une fonction virtuelle dans un constructeur de classe de base imprime-t-il la valeur de la classe de base, et non la valeur de la classe dérivée ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 05:24:10405parcourir

Why Does Calling a Virtual Function in a Base Class Constructor Print the Base Class Value, Not the Derived Class Value?

Invocation du constructeur de fonctions virtuelles

En C, les constructeurs sont responsables de l'initialisation des objets. Cependant, lorsqu'il s'agit de classes dérivées et de fonctions virtuelles, un comportement spécifique peut survenir qui peut ne pas être immédiatement intuitif.

Considérons l'exemple suivant :

#include <iostream>

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

Dans cet exemple, nous avons une base base de classe avec une fonction virtuelle value(). Une classe dérivée dérivée hérite de base et remplace value(). Le constructeur de base tente d'appeler value() dans son constructeur.

Lorsque le constructeur de dérivé est invoqué, le constructeur de base est appelé en premier. À ce stade, l'objet est toujours dans l'état de la classe de base et value() correspond à l'implémentation de la classe de base. C'est pourquoi le programme affiche "0" au lieu du "1" attendu.

Pour résoudre ce problème, nous devons nous assurer que l'objet est entièrement initialisé en tant que classe dérivée avant d'appeler value() dans le constructeur. . Une façon d'y parvenir est de retarder l'appel à value() jusqu'à ce que le constructeur de dérivé ait été exécuté, ce qui peut être fait en utilisant une fonction virtuelle dans le constructeur de la classe dérivée.

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