Maison > développement back-end > C++ > le corps du texte

Pourquoi le constructeur par défaut de la classe de base virtuelle est-il appelé dans une hiérarchie d'héritage virtuel ?

Linda Hamilton
Libérer: 2024-11-16 15:25:03
original
676 Les gens l'ont consulté

Why is the default constructor of the virtual base class called in a virtual inheritance hierarchy?

Héritage virtuel et invocation du constructeur par défaut

Dans une hiérarchie d'héritage impliquant l'héritage virtuel, le constructeur par défaut de la classe de base virtuelle peut être appelé de manière inattendue . Considérons le code suivant :

class grandmother {
public:
    grandmother() { // Default constructor
        std::cout << "grandmother (default)" << std::endl;
    }
    grandmother(int attr) { // Parameterized constructor
        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;
    }
};

int main() {
  daughter x(0);
}
Copier après la connexion

Lorsqu'une instance de la classe fille est créée, le résultat est :

grandmother (default)
mother: 0
daughter: 0
Copier après la connexion

Malgré l'existence d'un constructeur paramétré dans la classe grand-mère, le le constructeur par défaut est invoqué. Pourquoi cela se produit-il ?

Invocation du constructeur de classe de base virtuelle

Dans l'héritage virtuel, le constructeur de la classe de base virtuelle est directement appelé par le constructeur de la classe la plus dérivée. Dans ce cas, le constructeur fille appelle directement le constructeur grand-mère.

Étant donné que la classe mère n'appelle pas explicitement le constructeur grand-mère dans sa liste d'initialisation, le constructeur par défaut est utilisé. Pour invoquer correctement le constructeur souhaité, le constructeur fille doit être modifié en :

daughter(int attr) : grandmother(attr), mother(attr) { ... }
Copier après la connexion

En appelant explicitement le constructeur grand-mère (attr) dans la liste d'initialisation, le constructeur correct est utilisé et le résultat devient :

grandmother: 0
mother: 0
daughter: 0
Copier après la connexion

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