EC++: virtual dtor per classi base

Appunti tratti dalla rilettura di Effective C++ di Scott Meyers. Terzo blocco: Costruttori, distruttori e operatori di assegnamento.

(14) Il distruttore di una classe alla base di una gerarchia deve essere virtuale.

Il motivo di questo obbligo é che quando si distrugge l'istanza di una classe derivata per mezzo di un puntatore alla sua classe base e la classe base ha distruttore non-virtuale il risultato é, secondo lo standard del linguaggio, indefinito. Il che vuol dire, in genere, che viene chiamato solo il distruttore della classe base e non quello della derivata.

Per fare in modo che il comportamento sia quello atteso il distruttore della classe base deve essere dichiarato virtuale.

D'altra parte, se la classe non é pensata per essere alla base di una gerarchia di classi non é una buona idea dichiarare il suo distruttore come virtuale. Infatti dichiarare almeno una funzione di una classe come virtuale implica l'aggiunta di informazioni alla classe per permettergli di accedere alla virtual table - di solito questa informazione aggiuntiva é un puntatore.

A volte risulta utile dichiarare il distruttore come virtuale puro, anche se in realtà continua ad essere necessario definire il distruttore. Lo scopo di questa scelta é quello di rendere la classe astratta. Una classe é astratta, ovvero non può essere istanziata, se ha almeno una funzione virtuale pura. Ma se tutte le funzioni nell'interfaccia hanno una loro definizione di default, può essere utile definire come virtuale puro il distruttore (ricordandosi comunque di definirlo).

Nessun commento:

Posta un commento