Maison > développement back-end > C++ > Pourquoi le constructeur par défaut d'une classe de base virtuelle est-il invoqué lorsqu'un objet de classe dérivée est instancié ?

Pourquoi le constructeur par défaut d'une classe de base virtuelle est-il invoqué lorsqu'un objet de classe dérivée est instancié ?

Linda Hamilton
Libérer: 2024-11-20 04:22:02
original
670 Les gens l'ont consulté

Why is the Default Constructor of a Virtual Base Class Invoked when a Derived Class Object is Instantiated?

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;
    }
};
Copier après la connexion

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) { ... }
Copier après la connexion

Ce faisant, le constructeur correct de grand-mère est invoqué et le résultat comprendra ce qui suit line :

grandmother: 0
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal