Oppure

Loading
18/05/08 8:40
piesse78
diciamo che ho una classe Base e una classe Derivata che eredita dalla base, e per entrambe ho scritto costruttori e distruttori.

se io in una Terza classe dichiaro un membro

Base* pBase;

e nel costruttore della terza classe lo inizializzo così:

pBase = new Derivata();

e nel distruttore lo distruggo cosi':

delete pBase;

Ora, quando nel main dichiaro

Terza terza;

viene eseguito il costruttore della classe Terza -
in cui viene creato il puntatore pBase e viene eseguito quindi il costruttore della classe Base;
e infine quello della classe Derivata (poichè è creato attraverso new Derivata).

e ok.

Quando l'oggetto terza viene distrutto, viene eseguito il distruttore:
- della classe Base (visto che è pBase è un puntatore di tipo Base*)
- quello della classe Terza
ed in effetti il distruttore di Derivata non viene mai eseguito! Poichè appunto pBase è dichiarato di tipo Base* (ma è effettivamente inizializzato come Derivata).

Ordunque... io ho bisogno di avere un puntatore a questo oggetto, che potrebbe essere appartenente a una qualsiasi delle classi che derivano da Base.

Immagino che sia un problema il fatto di non poter distruggere eventuali puntatori che siano dichiarati nelle classi derivate. Oppure vengono distrutti automaticamente? Oppure come si fa in questi casi?
aaa
19/05/08 8:50
pierotofy
Dichiara in ogni classe derivata un metodo per la pulizia (contenente le equivalenti istruzioni del distruttore) e chiama questo metodo esplicitamente dal distruttore di Terza prima di distruggere l'oggetto.

//in Terza
//...
~Terza(){
  pBase.dispose(); //metodo che fa pulizia
  delete pBase;
}
//...
Il mio blog: piero.dev
19/05/08 9:00
piesse78
mmh ieri ho trovato un'altra soluzione.. e cioè..
dichiarare il distruttore della classe base come virtual in modo che poi la pulizia venga fatta comunque dal distruttore della classe derivata ;)
aaa
19/05/08 9:03
pierotofy
Il metodo che hai trovato che mi sembra più coerente alla filosofia OOP, quindi meglio della soluzione da me proposta.
Il mio blog: piero.dev