Domanda

Se scriviamo una funzione virtuale, aggiunge una vtable nell'oggetto di quella classe. È vero anche per il distruttore virtuale? Vtable viene utilizzato per implementare la virtualità del distruttore

È stato utile?

Soluzione

Sì. Sono necessarie alcune informazioni per consentire la chiamata del distruttore giusto quando l'oggetto viene eliminato tramite un puntatore della classe base. Se tali informazioni sono un indice intero piccolo o un puntatore non importa (anche se il collegamento dinamico probabilmente implica che si tratta di un puntatore). Naturalmente, tali informazioni devono essere adiacenti (all'interno) dell'oggetto puntato.

L'aggiunta di un metodo virtuale di qualsiasi tipo, incluso un distruttore, a una classe che non aveva mai avuto prima, aumenterà la dimensione di (classe).

Altri suggerimenti

Non credo che lo standard C ++ richieda alcun meccanismo particolare per produrre il comportamento corretto, ma sì, questa è un'implementazione tipica. Una classe con almeno 1 funzione virtuale ha una tabella di puntatori a funzioni (virtuali), il distruttore è uno di questi, se è contrassegnato come virtuale.

Sì, lo è. Mi dispiace non ho un riferimento definitivo per il backup della mia affermazione. Ma in che altro modo potresti avere un comportamento diverso quando usi solo un puntatore all'oggetto?

Sì. Il distruttore virtuale è come qualsiasi altro metodo virtuale. Verrà aggiunta la voce Vtable.

Viene trattato come qualsiasi altra normale funzione e verrà aggiunto alla vtable.

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