Newsgroup: it.comp.lang.c++
Titolo: distruttori ed ereditarietà

Salve ragazzi,
nel corso di uno sviluppo ho avuto un comportamento curioso che ritengo
interessante descrivere qui, se qualcuno ha qualche riferimento in
letteratura sono piuttosto interessato.
Ho un classe Base con svariate funzioni virtuali che viene gestita da un
sistema di configurazione, ho poi una serie di oggetti Figli che
ereditano la classe base e vengono gestiti attraverso puntatori alla
classe base.
poichè la classe base manutiene gli oggetti è lei a creare e distruggere
gli oggetti; per crearli utilizzo una funzione associata agli oggetti
che crea l'oggetto figlio e restituisce l'oggetto padre (praticamente ho
un pattern factory).
Ora quando distruggo l'oggetto utilizzando il puntatore al padre il
distruttore del figlio non viene mai chiamato, è normale??
La soluzione che ho trovato è stata banalmente quella di inserire una
funzione virtuale che ciascun figlio aggiorna (approccio che crea
problemi con i nipoti); un'altra possibilità è quella di esportare
funzioni distruttrici così come quelle creatrici.
Insomma la soluzione c'e', quello che non so è se c'e' della letteratura
sull'argomento!
Saluti a tutti

sull'argomento!
La letteratura c'è, e dice che in questo caso (puntatori a classe base che
puntano a tipo derivato) il distruttore deve essere dichiarato virtual, in
modo che si possa risalire all'effettiva identità dell'oggetto puntato, e
richiamare il costruttore giusto (alcuni compilatori segnalano come warning
l'assenza di un distruttore virtual in una classe base virtuale).
Quindi, dichiarando il distruttore come virtual risolveresti tutti i tuoi
problemi (senza bisogno di stratagemmi...).
Ciao
Domenico Barra

 distruttore del figlio non viene mai chiamato, è normale??
Si, se non hai definito virtuale il distruttore della classe padre.
EMG

Ma la soluzione del distruttore virtual, che in effetti è quella per la
definizione di classi astratte, non crea la complicazione di non poter
avere un distruttore nel padre? la mia class basa ha un po' d roba da
distruggere prima di morire...
poteri mettere una funzione destroy() nel padre e chiedere al figlio di
richiamarla, ma è uno stratagemma come gli altri!
Grazie mille
e scunsate per il tempo impiegato a rispondere, am non ho avuto accesso
ad internet in questio giorni...
Salutoni
Massimiliano Rak

distruggere prima di morire...
Il distruttore di una classe derivata chiama sempre automaticamente
il distruttore di tutti i membri e della classe base da cui deriva.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

distruggere prima di morire...
No, questa complicazione non c'è affatto (sarebbe una grossa limitazione del
linguaggio). Basta che dichiari il normale distruttore della classe base
come virtual e non avrai problemi. Nota inoltre che il distruttore di una
classe B derivata da A chiama prima il distruttore di B, poi quello di A.
Ciao
Domenico Barra

chiama prima il distruttore di B, poi quello di A.
Non vorrei sbagliarmi, ma se il distruttore di A non e' virtuale, non
si ha un comportamento indefinito, secondo lo standard ?
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

si ha un comportamento indefinito, secondo lo standard ?
Solo se il tipo dinamico e statico non coincidono (ad esempio se
la chiamata a delete viene fatta passando un puntatore a base).


si ha un comportamento indefinito, secondo lo standard ?
Assolutamente no :-).
Il comportamento indefinito si ha nel caso che tu abbia un puntatore ad una
classe base col quale distruggi un oggetto dinamico di tipo classe derivata.
Altrimenti (gestione statica dell'oggetto oppure esatta corrispondenza di
tipi tra puntatore ed ogg. dinamico) il problema non si verifica: sarebbe
una grave limitazione del C++.
Ciao
Domenico Barra

 Saluti a tutti

mettere nomedelpadre:~nomedelpadre;(lancia il distruttore del padre!!!)?
Non ce n'è affatto bisogno: il distruttore della classe base viene chiamato
automaticamente da quello della classe derivata.
Ciao
Domenico Barra

 Domenico Barra