C++ виртуальное наследование

Проблема:

class Base {
public:
  Base(Base* pParent);
  /* implements basic stuff */
};

class A : virtual public Base {
public:
  A(A* pParent) : Base(pParent) {}
  /* ... */
};

class B : virtual public Base {
public:
  B(B* pParent) : Base(pParent) {}
  /* ... */
};

class C : public A, public B {
public:
  C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here
  /* ... */
};

В данном положении gcc жалуется, что это не может соответствовать вызову функции Базироваться (), т.е. конструктор по умолчанию. Но C не наследовался непосредственно Основе, только через A и B. Итак, почему gcc жалуется здесь?

Идеи? TIA / грабят

22
задан s4y 7 June 2012 в 23:33
поделиться

3 ответа

virtual base classes особенность в том, что они инициализируются самым производным классом, а не какими-то промежуточными базовыми классами, которые наследуются от виртуальной базы. Какой из потенциальных множественных инициализаторов будет правильным выбором для инициализации одного базового класса?

Если самый производный класс, который строится, не внесен в список его членов-инициализаторов, то виртуальный базовый класс инициализируется своим конструктором по умолчанию, который должен существовать и быть доступен.

Обратите внимание, что идентификатор виртуальной базы допускается использовать в списке инициализатора конструктора, даже если он не является прямой базой рассматриваемого класса.

46
ответ дан 29 November 2019 в 03:53
поделиться

Если вы объявляете пользовательский конструктор, конструктор по умолчанию отключен. В виртуальном наследовании вам нужно позвонить практически наследственному конструктору напрямую, потому что в противном случае он не знает, будет ли инициализировать по A или B.

5
ответ дан 29 November 2019 в 03:53
поделиться

Вы должны явно вызывать конструктор для Base из C:

class C : public A, public B {
public:
C(C* pParent) : Base(pParent), A(pParent), B(pParent) {}
/*... */
};
8
ответ дан 29 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: