Почему конструктор Default вызывается в виртуальном наследовании?

c++ inheritance virtual-inheritance

12813 просмотра

1 ответ

362 Репутация автора

Я не понимаю, почему в следующем коде, когда я создаю экземпляр объекта типа 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);
}
Автор: Simon Desfarges Источник Размещён: 28.03.2012 12:42

Ответы (1)


77 плюса

88399 Репутация автора

Решение

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

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

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

Смотрите также этот раздел FAQ .

Автор: interjay Размещён: 28.03.2012 12:58
Вопросы из категории :
32x32