Почему конструктор Default вызывается в виртуальном наследовании? - PullRequest
71 голосов
/ 28 марта 2012

Я не понимаю, почему в следующем коде, когда я создаю объект типа 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 Ответ

76 голосов
/ 28 марта 2012

При использовании виртуального наследования конструктор виртуального базового класса вызывается непосредственно конструктором самого производного класса.В этом случае конструктор daughter напрямую вызывает конструктор grandmother.

Поскольку вы явно не вызывали конструктор grandmother в списке инициализации, будет вызван конструктор по умолчанию.Чтобы вызвать правильный конструктор, измените его на:

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

См. Также Эта запись часто задаваемых вопросов .

...