Invocation de constructeur par défaut dans l'héritage virtuel
L'héritage virtuel, un mécanisme d'héritage C, vise à résoudre le problème de l'héritage diamant ou de l'héritage répétitif. Dans ce contexte, une question se pose : pourquoi le constructeur par défaut de la classe de base virtuelle est-il invoqué lors de l'instanciation d'un objet de classe dérivé ?
Ce comportement est issu de la conception de l'héritage virtuel. Contrairement à l'héritage traditionnel, où le constructeur de la classe de base est appelé par le constructeur de la classe dérivée via la liste d'initialisation, dans l'héritage virtuel, le constructeur de la classe la plus dérivée appelle directement le constructeur de la classe de base virtuelle.
Dans le exemple fourni :
class grandmother { public: grandmother() { std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { std::cout << "grandmother: " << attr << std::endl; } }; class mother: virtual public grandmother { public: mother(int attr) : grandmother(attr) { std::cout << "mother: " << attr << std::endl; } }; class daughter: virtual public mother { public: daughter(int attr) : mother(attr) { std::cout << "daughter: " << attr << std::endl; } };
Lors de l'instanciation d'un objet de type fille, le constructeur fille appelle directement le constructeur grand-mère. Cependant, comme aucun constructeur spécifique n'est invoqué dans la liste d'initialisation du constructeur fille, le constructeur par défaut de grand-mère est appelé par défaut.
Pour appeler explicitement le constructeur souhaité, la liste d'initialisation du constructeur fille doit être modifiée à :
daughter(int attr) : grandmother(attr), mother(attr) { ... }
Ce faisant, le constructeur correct de grand-mère est invoqué et le résultat comprendra ce qui suit line :
grandmother: 0
Comprendre ce comportement est crucial lorsque l'on travaille avec l'héritage virtuel, car il garantit une initialisation et une construction d'objet appropriées.
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!