8

Sto leggendo "Dentro il modello a oggetti C++", cercando di capire come si ottiene l'ereditarietà multipla e virtuale tramite i vtables (capisco perfettamente il singolo polimorfismo).Layout di memoria di una classe con ereditarietà multipla o virtuale e vtable (s)?

Ho difficoltà a capire che cosa esattamente si fa quando un metodo deve essere localizzato durante l'ereditarietà virtuale, o durante la trasmissione, perché c'è un sacco di calcolo di offset da eseguire.

Qualcuno potrebbe essere d'aiuto nel comprendere come vengono utilizzati i multipli vtables in un esempio di ereditarietà multipla o virtuale? Se potessi capire il layout e il problema, probabilmente potrei capire meglio questo problema.

+0

quando si dice eredità multipla, si intende avere successive deviazioni (c eredita da b che eredita da a) o si intende reale ereditarietà multipla (c eredita simultaneamente da un a b)? – Christophe

+0

Forse questa domanda aiuta http://stackoverflow.com/q/11603198/1741542 –

risposta

10

Le implementazioni C++ generalmente utilizzano vtables per implementare funzioni virtuali. Un vtable è una tabella di puntatori alle funzioni. Ogni oggetto di una classe con funzioni virtuali ha un puntatore nascosto al vtable che contiene gli indirizzi di tutte le funzioni virtuali della classe.

Quando si richiama una funzione virtuale, il codice calcola l'offset del puntatore di funzione nel vtable e chiama la funzione in cui è memorizzato l'indirizzo.

enter image description here

Quando una classe derivata della classe base overides una funzione virtuall, la tabella virtuale di quella classe solo punti alla funzione overidden invece di quello originale.

Questo excellent article explains in dettaglio come funziona, sia per l'ereditarietà singola che multipla.

Problemi correlati