come evitare di chiamare funzione virtuale nel costruttore o distruttore?
Domanda
Alcuni materiali C ++ parlare non si può chiamare una funzione virtuale all'interno ctor o dtor,
(
mi dispiace, penso che sia meglio cambiare per
Alcuni materiali C ++ menzionare che sia meglio non chiamare una funzione virtuale all'interno ctor o dtor,
)
ma possiamo chiamare accidentalmente. C'è un modo per evitare questo?
Ad esempio:
# include < iostream >
using namespace std;
class CAT
{
public:
CAT(){ f();}
virtual void f(){cout<<"void CAT:f()"<<std::endl;}
};
class SMALLCAT :public CAT
{
public:
SMALLCAT():CAT()
{
}
void f(){cout<<"void SMALLCAT:f()"<<std::endl;}
};
int main()
{
SMALLCAT sc;
}
uscita:
void CAT::f() //not we expected!!!
Grazie
Nessuna soluzione corretta
Altri suggerimenti
È necessario gettare quei "materiali C ++" al bidone della spazzatura.
È certamente possono richiamare le funzioni virtuali dal costruttore o distruttore. E faranno il loro lavoro. Hai semplicemente bisogno di essere a conoscenza della specifica linguaggio che chiaramente afferma che il meccanismo spedizione virtuale funziona secondo la corrente tipo dinamico dell'oggetto, non con la sua finale destinato tipo dinamico . Questi tipi non sono gli stessi per un oggetto in costruzione / distruzione, che spesso confonde neofiti quando tentano di richiamare le funzioni virtuali da costruttori / distruttori. Tuttavia, chiamando funzioni virtuali dal costruttore e distruttore è utile funzione della lingua, fino a quando si sa che cosa fanno e come funzionano in questi casi. Perché si vuole per "prevenire" è vero?
E 'come dire che operatore di divisione è pericoloso, in quanto si può dividere per zero qualcosa, e chiedendo come "prevenire" il suo utilizzo nel programma.
È possibile chiamare una funzione virtuale all'interno di un distruttore. Solo in alcuni casi non funziona, e può bloccare il programma. Il modo per evitare di chiamarli non è loro di chiamare. Non c'è niente di più elaborato che conosco, a parte forse qualche strumenti di analisi statica di guardare il codice e avvertire di potenziali problemi di questo tipo.
Si può certamente chiamare una funzione virtuale all'interno di un ctor / dtor. Il problema è che il vtable è impostato in ogni costruttore (e distruttore), quindi la chiamata di funzione virtuale chiamerà l'implementazione della classe che è in fase di allestimento. Se questo è ciò che si vuole, raffreddare. Ma poi si può anche risparmiare la ricerca vtable e fare una chiamata di funzione con ambito.