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!