Perché il costruttore predefinito è chiamato nell’ereditarietà virtuale?

Non capisco perché nel seguente codice, quando instanzo un object di tipo daughter , viene chiamato il costruttore predefinito grandmother() ?

Ho pensato che fosse necessario chiamare il costruttore della grandmother(int) (per seguire le specifiche del costruttore della mia class mother ), altrimenti questo codice non dovrebbe essere compilato a causa dell’ereditarietà virtuale.

Qui il compilatore chiama silenziosamente la grandmother costruttore di default nella mia schiena, mentre non l’ho mai chiesto.

 #include  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); } 

Quando si utilizza l’ereditarietà virtuale, il costruttore della class base virtuale viene chiamato direttamente dal costruttore della class più derivata. In questo caso, il costruttore daughter chiama direttamente il costruttore della grandmother .

Dal momento che non hai chiamato esplicitamente il costruttore della grandmother nella lista di inizializzazione, verrà chiamato il costruttore predefinito. Per chiamare il costruttore corretto, cambialo in:

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

Vedi anche questa voce delle FAQ .