Почему конструктор 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);
}

Ответы на вопрос(1)

Ваш ответ на вопрос