Salve a tutti, sto facendo dei test ma la situazione non mi è molto chiara.
Supponiamo di avere
codice:
class Base{
public:
Base() {v = new double;}
virtual ~Base() {delete v;}
void unMetodo() =0;
//più costruttore di copia, operatore assegnamento, eccetera
protected:
doulbe* v;
}
class Ereditata: public Base{
public:
Ereditata() : Base(){}
~Ereditata() { //non ci scrivo niente }
double nuovoMetodo(int i) const;
}
Da quello che ho capito e che mi risulta effettivamente dai test quando chiamo il distruttore della classe figlia viene chiamato anche quello della classe padre, quindi se per caso io scrivessi
codice:
~Ereditata() { delete v;}
lo cancellerei due volte?
Non riesco a trovare questa informazione espressa in modo esplicito da alcuna parte, la cosa che mi inghippa è il "virtual", in teoria se metto virtual nella classe padre, il distruttore della classe padre non dovrebbe essere invocato giusto? O vengono comunque invocati entrambi?
Se nella classe figlia non inserisco puntatori fra le proprietà, e tolgo il virtual dal distruttore della classe padre, *v verrà cancellato perchè verrà invocato automaticamente ~Base() ?