comment éviter d'appeler la fonction virtuelle dans le constructeur ou destructor?

StackOverflow https://stackoverflow.com/questions/4495640

  •  12-10-2019
  •  | 
  •  

Question

Certains matériaux C ++ mentionnent nous ne pouvons pas appeler une fonction virtuelle à l'intérieur cteur ou dtor,

(
désolé, je pense qu'il est préférable de changer de
Certains matériaux C ++ mentionnent que nous ferions mieux de ne pas appeler une fonction virtuelle à l'intérieur cteur ou dtor,

)

mais on peut les appeler accidentellement. Y at-il moyen d'éviter cela?

Par exemple:

# 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;   

}  

sortie:

void CAT::f()  //not we expected!!!

Merci

Pas de solution correcte

Autres conseils

Vous devez jeter ces « matériaux C ++ » à la poubelle.

Vous avez certainement peut appeler des fonctions virtuelles à partir du constructeur ou destructor. Et ils feront leur travail. Vous avez simplement besoin d'être au courant de la spécification de langage qui indique clairement que le mécanisme d'envoi virtuel fonctionne conformément à la courant type dynamique de l'objet, non pas avec son finale destiné type dynamique . Ces types ne sont pas les mêmes pour un objet en construction / destruction, qui confond souvent les débutants lorsqu'ils tentent d'invoquer des fonctions virtuelles de constructeurs / destructeurs. Néanmoins, appeler des fonctions virtuelles du constructeur et est destructor fonction utile de la langue, aussi longtemps que vous savez ce qu'ils font et comment ils fonctionnent dans de tels cas. Pourquoi voudriez-vous « éviter » il?

Il est comme dire que l'opérateur de division est dangereux car on peut diviser par zéro quelque chose, et demandant comment « empêcher » son utilisation dans le programme.

Vous pouvez appeler une fonction virtuelle dans un destructor. Seulement dans certains cas, il ne fonctionnera pas, et peut se bloquer votre programme. La façon d'éviter de les appeler est de ne pas les appeler. Il n'y a rien que je connaisse colombophile, autre que peut-être des outils d'analyse statique pour regarder votre code et vous avertir des problèmes potentiels comme celui-ci.

Vous ne pouvez certainement appeler une fonction virtuelle dans un cteur / dtor. Le problème est que votre vtable est mis en place dans chaque constructeur (et destructor), de sorte que votre appel de fonction virtuelle appellera la mise en œuvre de la classe qui est actuellement mis en place. Si c'est ce que vous voulez, refroidir. Mais vous pouvez aussi bien vous sauver la recherche vtable et faire un appel de fonction scope.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top