tipos simple resueltos programacion polimorfismo orientada objetos herencia ejercicios destructores derivada constructores clases clase c++ inheritance virtual-inheritance

simple - polimorfismo en c++



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

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 .

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 compilarse en absoluto debido a la herencia virtual.

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

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