Assumere le classi D ed E e F tutti ereditano dalla classe base B, e che classe C eredita da D ed E.diamante eredità
(i) Quante copie di classe B compaiono in classe C?
(ii) In che modo l'utilizzo dell'ereditarietà virtuale modifica questo scenario? Spiega la tua risposta.
(iii) In che modo Java evita la necessità di ereditarietà multipla per molte delle situazioni in cui è possibile utilizzare l'ereditarietà multipla in C++?
Ecco alcune delle mie idee attuali, ma non sono affatto un esperto di C++!
(i)
Se C eredita da D ed E che sono sottoclassi di B, allora D ed E sarebbero tecnicamente copie della loro super classe? Quindi se C eredita da D ed E significherebbe che ci sono 2 copie di B in C.
(ii)
L'utilizzo di virtual è in qualche modo simile all'utilizzo di Abstract in Java (credo). Detto questo, significherebbe che non ci sarebbero più copie di B in C, in quanto l'istanza sarebbe ricondotta al livello necessario. Non sono sicuro di come pronunciare la mia spiegazione, ma diciamo che B ha una funzione chiamata print() che stampa "i am B" e C sovrascrive questa funzione inserisce le stampe "i am C". Se si chiama print() su C senza virtual si finisce per stampare "i am B", usando virtual significherebbe che stamperebbe "i am C".
(iii)
La mia idea è che Java può utilizzare le interfacce per evitare l'uso dell'ereditarietà multipla. È possibile implementare più interfacce ma è possibile estendere solo una classe. Non sono sicuro di cos'altro aggiungere qui, quindi qualsiasi input o risorse rilevanti sarebbe utile.
+1 un grande esempio di "Ho bisogno di aiuto ma ecco quello che ho provato" domanda – yizzlez
La risposta breve per '(ii)' è che ci sarebbe solo una copia di B. Speriamo che una risposta spiegherà questo ulteriore – yizzlez
+1, questo potrebbe anche aiutarti: http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem –