¿Por qué se llama al constructor predeterminado en herencia virtual?

No entiendo por qué en el siguiente código, cuando instancia un objeto de tipo daughter , se llama al constructor grandmother() predeterminado.

Pensé que se debería llamar al constructor grandmother(int) (para seguir la especificación de mi constructor de clase mother ), o este código no debería comstackrse en absoluto debido a la herencia virtual.

Aquí el comstackdor llama silenciosamente al constructor predeterminado de la grandmother en mi espalda, mientras que yo nunca lo pedí.

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

Al usar la herencia virtual, el constructor de la clase más derivada llama directamente al constructor de la clase base virtual. En este caso, el constructor daughter llama directamente al constructor de la grandmother .

Como no llamó explícitamente al constructor de grandmother en la lista de inicialización, se llamará al constructor predeterminado. Para llamar al constructor correcto, cámbielo a:

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

Ver también esta entrada de preguntas frecuentes .