Se si dichiarano funzioni virtuali, è necessario dichiarare anche il distruttore virtuale ;-).
B ha una tabella virtuale, perché ha una funzione virtuale, cioè func0()
. Se dichiari una funzione (incluso un distruttore) virtuale in una classe base, tutte le sue classi derivate avranno anche la funzione con la stessa firma virtuale. E causerà loro di avere un vtable. Inoltre, B avrebbe il vtable anche se non hai dichiarato esplicitamente func0
.
Le funzioni non virtuali non sono referenziate tramite vtables.
Vedi VTables 2.
No. classi sono costruiti basano su dichiarazioni di classe. I corpi delle funzioni di classe (per non parlare di altre funzioni) non sono presi in considerazione. Pertanto, B ha un vtable, perché la sua funzione func0()
è virtuale.
C'è anche un dettaglio difficile, anche se non è l'essenza della tua domanda. Hai dichiarato la tua funzione B::func0()
come inline. Nel compilatore gcc
, se una funzione virtuale viene dichiarata in linea, mantiene il suo slot nella tabella virtuale, lo slot che punta a una funzione speciale emessa per quella in linea (che conta come prendendo l'indirizzo, che rende inline emesso). Ciò significa che se la funzione è in linea non influenza la quantità di slot in vtable e la sua necessità per una classe.
fonte
2009-09-05 16:04:57
Sarebbe bello se dicessi in tali domande quale compilatore stai usando. Le tabelle virtuali sono specifiche dell'implementazione, anche se ci sono sforzi per standardizzare il loro formato. –
'b :: func0' ** è ** virtuale –