Si consideri il codiceereditarietà multipla classe base ambiguo
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() {}
Il compilatore (g ++ 5.1) avverte che
avvertimento: di base diretta
'Base'
inaccessibili in'B'
a causa dell'ambiguitàstruct B: public A, public Base{};
Capisco, Base
è duplicato in B
.
Perché non c'è nessun avvertimento per
C
?C
non eredita sia daA
sia daDerived
, che entrambi ereditano daBase
?Perché aggiungendo
virtual
struct Derived: virtual Base{};
risultati ora in entrambe le B
e C
avvertimenti che emettono, in diretta su Wandbox
avvertimento: di base diretta
'Base'
inaccessibili in'B'
a causa dell'ambiguitàstruct B: public A, public Base{};
avvertimento: base diretta
'Base'
inaccessibili in'C'
causa dell'ambiguitàstruct C: public A, public Derived{};
ricerca su Internet per "eredità diamante temuto". –
@ThomasMatthews So qual è il problema del diamante, ed è strettamente correlato al perché "B" dà un avvertimento. Comunque quello che non capisco è perché 'C' è OK. – vsoftco
Penso che sia solo un caso di gcc che non rileva l'ambiguità in 'C' perché' Base' * è * ambiguo anche in questo caso.Quando derivate virtualmente da 'Base' la classe più derivata (' C') è responsabile per chiamare il costruttore 'Base', e così gcc inizia a rilevare di nuovo l'ambiguità. – Praetorian