Рассмотрим код
struct Base{};
struct Derived: public Base{};
struct A: public Base{};
struct B: public A, public Base{};
struct C: public A, public Derived{}; // why no ambiguity here?
int main() {}
Компилятор (g++ 5.1) предупреждает, что
предупреждение: прямая база
'Base'
недоступна в'B'
из-за двусмысленностиstruct B: public A, public Base{};
Я понимаю это, Base
дублируется в B
.
-
Почему нет предупреждения для
C
? Не наследуетC
как отA
, так и отDerived
, которые оба наследуют отBase
? -
Зачем добавлять
virtual
struct Derived: virtual Base{};
теперь выводится как в сообщениях B
, так и C
, нажимая на Wandbox
предупреждение: прямая база
'Base'
недоступна в'B'
из-за двусмысленностиstruct B: public A, public Base{};
предупреждение: прямая база
'Base'
недоступна в'C'
из-за двусмысленностиstruct C: public A, public Derived{};