Почему конструктор Default вызывается в виртуальном наследовании?
Я не понимаю, почему в следующем коде, когда я создаю экземпляр объекта типаdaughter
, по умолчаниюgrandmother()
конструктор называется?
Я думал, что либоgrandmother(int)
конструктор должен быть вызван (чтобы следовать спецификации моегоmother
конструктор класса), или этот код не должен компилироваться вообще из-за виртуального наследования.
Здесь компилятор тихо вызываетgrandmother
конструктор по умолчанию у меня за спиной, тогда как я никогда не просил об этом.
#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);
}