Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - classi derivate e distruttori
Forum - C/C++ - classi derivate e distruttori

Avatar
piesse78 (Normal User)
Newbie


Messaggi: 5
Iscritto: 27/03/2007

Segnala al moderatore
Postato alle 10:40
Domenica, 18/05/2008
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?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 10:50
Lunedì, 19/05/2008
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.

Codice sorgente - presumibilmente Plain Text

  1. //in Terza
  2. //...
  3. ~Terza(){
  4.   pBase.dispose(); //metodo che fa pulizia
  5.   delete pBase;
  6. }
  7. //...



Il mio blog: https://piero.dev
PM Quote
Avatar
piesse78 (Normal User)
Newbie


Messaggi: 5
Iscritto: 27/03/2007

Segnala al moderatore
Postato alle 11:00
Lunedì, 19/05/2008
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 ;)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 11:03
Lunedì, 19/05/2008
Il metodo che hai trovato che mi sembra più coerente alla filosofia OOP, quindi meglio della soluzione da me proposta.


Il mio blog: https://piero.dev
PM Quote