Rozważmy kodWielokrotne dziedziczenie klasy niejednoznaczne baza
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() {}
kompilator (g ++ 5.1) ostrzega, że
ostrzeżenie: bezpośredni baza
'Base'
niedostępne w'B'
powodu niejednoznacznościstruct B: public A, public Base{};
Rozumiem to, Base
jest duplikowane w B
.
Dlaczego nie ma ostrzeżenie dla
C
? CzyC
nie dziedziczy poA
iDerived
, które dziedziczą poBase
?Dlaczego dodanie
virtual
struct Derived: virtual Base{};
wyniki teraz w obu B
i C
emitujących ostrzeżeń, żyją na Wandbox
ostrzeżenia: bezpośredni bazę
'Base'
niedostępnych w'B'
powodu niejednoznacznościstruct B: public A, public Base{};
ostrzeżenie: bezpośredni baza
'Base'
niedostępne w'C'
powodu niejednoznacznościstruct C: public A, public Derived{};
wyszukiwarka internetowa dla „strasznych diamentowej dziedziczenia”. –
@ThomasMatthews Wiem, czym jest problem z diamentem i jest to ściśle związane z tym, dlaczego 'B' ostrzega. Jednak nie rozumiem, dlaczego "C" jest w porządku. – vsoftco
Myślę, że to tylko przypadek, w którym gcc nie wykrywa niejednoznaczności w 'C', ponieważ' Base' * jest * niejednoznaczny w tym przypadku.Kiedy wirtualnie wywodzisz się z 'Base', najbardziej pochodna klasa (' C') jest odpowiedzialna za wywołanie konstruktora 'Base', a więc gcc ponownie wykrywa niejednoznaczność. – Praetorian