Domanda

Secondo la mia (limitata) conoscenza della specifica C ++, vtable di una classe con membri virtuali è posto alla definizione del primo metodo virtuale non pura non in linea. Come fanno i compilatori gestire classi che ereditano da una classe con tutti i metodi virtuali puri (interfacce, per esempio)? Dove si trova il vtable collocato in questo caso?

È stato utile?

Soluzione

I negozi vtable gli indirizzi del implementati metodi virtuali. Se tutti i metodi di una classe sono puri-virtuali e nessuno sono implementati, quindi non ha bisogno di vtable da generare.

Non si poteva utilizzare tale classe A per molto senza alcune classi che ne derivano e implementare i metodi. Ogni classe con metodi virtuali implementati ha i suoi singoli indirizzi contenenti vtable per tutti i metodi virtuali: non fa in alcun modo riferimento alle VTables di classi base; gli indirizzi sono duplicati. Quindi, se si dispone di una classe che eredita da un'altra classe, quella classe utilizzeranno solo la propria vtable. Essa non si preoccupa vtable della classe di base; questo vtable non ha nemmeno bisogno di esistere.

La specifica C ++ per sé non dice nulla circa VTables; essi sono semplicemente un comportamento del compilatore che è diventato comune.

Altri suggerimenti

Lo standard C ++ non specifica nulla di posizionamento vtable, o anche l'esistenza di un vtable. Si specifica solo comportamento, e una v-table sembra essere il più semplice attuazione, quindi ampiamente utilizzato.

In pratica, l'unica ragione per una v-table esistere per una classe astratta viene utilizzata durante la costruzione e distruzione, quando il tipo dinamico dell'oggetto è la classe astratta.

In una classe con funzioni virtuali solo puri, c'è chiaramente può esserci costruttori (dal costruttori non possono essere virtuali). Tuttavia, distruttori certamente può essere virtuale.

La classe potrebbe ancora avere un distruttore virtuale pura è richiesta un'implementazione e poi la v-tavolo (o dettagli di implementazione equivalenti).

ma le implementazioni di funzioni virtuali puri sono rari, e non sarebbe stato fatto quando si definisce un'interfaccia.

Non c'è bisogno di un vtable fino ad avere un'istanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top