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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top