Рассмотрим кодМножественное наследование неоднозначным базовый класс
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{};
Поиск Интернет для «страшном алмазным наследство». –
@ThomasMatthews Я знаю, что такое проблема с алмазами, и это тесно связано с тем, почему «B» дает предупреждение. Однако я не понимаю, почему 'C' в порядке. – vsoftco
Я думаю, что это просто случай, когда gcc не обнаруживает двусмысленность в 'C', потому что' Base' * is * неоднозначный в этом случае тоже.Когда вы фактически выходите из 'Base', самый производный класс (' C') отвечает за вызов конструктора 'Base', и поэтому gcc снова начинает обнаруживать неоднозначность. – Praetorian