L'ereditarietà multipla può dar luogo ad alcune situazioni in cui si ha una inutile duplicazione
di dati e funzioni, con conseguente spreco di memoria e possibili ambiguità.
Si consideri il seguente esempio:
class CellulareDigitale { . . . }; class GSM:public CellulareDigitale { . . . }; class DCS:public CellulareDigitale { . . . }; class DualBand:public GSM, public:DCS { . . . };ovvero graficamente:
La classe "Dual Band" contiene due istanze della classe "Cellulare Digitale": ciò comporta sia uno spreco di memoria sia una situazione di ambiguità nel casoin cui nelle due istanze siano memorizzati dati diversi.
Più in generale, tale situazione si presenta nella cosidetta struttura a Diamante:
In tale circostanza, la situazione in memoria centrale sarebbe la seguente:
Per risolvere questo problema, il C++ mette a disposizione le cosidette Classi Base Virtuali,
ossia si utilizza la keyword virtual per definire una derivazione da una classe base in
una struttura del tipo a diamante. La sintassi è la seguente:
class CellulareDigitale { . . . }; class GSM:public virtual CellulareDigitale { . . . }; class DCS:public virtual CellulareDigitale { . . . }; class DualBand { . . . };Quando il compilatore incontra una classe base virtuale evita la duplicazione della classe base in corrispondenza dell'ultima classe derivata.
![]() Precedente |
![]() Home page |
![]() Successivo |