83 votes

Pourquoi le constructeur par défaut est-il appelé dans l'héritage virtuel?

Je ne comprends pas pourquoi dans le code suivant, quand je l'instancier un objet de type daughter, la valeur par défaut grandmother() constructeur est appelé ?

Je pensais que soit l' grandmother(int) constructeur devrait être appelé (à suivre le cahier des charges de mon mother le constructeur de la classe), ou de ce code ne compile pas du tout à cause de l'héritage virtuel.

Ici compilateur silencieusement appels grandmother constructeur par défaut dans mon dos, alors que je n'ai jamais demandé ça.

#include <iostream>

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

int main() {
  daughter x(0);
}

90voto

interjay Points 51000

Lors de l'utilisation de l'héritage virtuel, virtuel de la classe de base du constructeur est appelé directement par la plupart des dérivés du constructeur de la classe. Dans ce cas, l' daughter constructeur appelle directement l' grandmother constructeur.

Puisque vous n'avez pas appeler explicitement grandmother constructeur dans la liste d'initialisation, le constructeur par défaut sera appelée. Pour appeler le bon constructeur, le modifier:

daugther(int attr) : grandmother(attr), mother(attr) { ... }

Voir aussi Cet article de la FAQ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X