Devo dichiarare il metodo di finalizzazione finalize()
per tutti i discendenti della classe base Base
, che dovrebbe essere chiamato durante la distruzione, e il mio intento era di chiamare puro virtual void Base::finalize() = 0
dal ~Base()
, ma C++ proibisce una cosa del genere. Quindi la mia domanda èChiamare il metodo virtuale dal distruttore - soluzione alternativa?
Come possiamo obbligare i discendenti di fare qualche lavoro di finalizzazione in modo giusto e definito preliminare?
Questo codice non può essere compilato:
#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
Se faccio Base::finalize()
non virtuale pura, si chiama da ~Base()
senza dispacciamento a figlio poiché è stato già distrutta.
posso chiamare finalizzare() dal distruttore del bambino ma domanda è come alla forza per farlo. In altre parole, la mia domanda è: è possibile obbligare le persone che scriveranno discendenti della classe Base a usare il metodo di finalizzazione, beh, in un altro modo che commentare in una documentazione? :)
Ok, lo vedo, ma la mia domanda è: è possibile obbligare le persone che scriveranno i discendenti della classe Base ad usare il metodo di finalizzazione, beh, in un altro modo che commentarlo in una documentazione? :) –
È possibile ma potresti ottenere errori di compilazione o di run-time, perché quando viene chiamato il distruttore di 'Base', il distruttore di' A' è già stato chiamato così non c'è alcun oggetto 'A' su cui chiamare il cosiddetto metodo 'finalize()'. –
Ho usato il tuo codice di esempio e definito 'finalize()' per 'Base', rendendolo così semplice virtuale (non puro). Compilare, ma vedere cosa si ottiene dalla sua esecuzione http://ideone.com/opDXc –