
Envoyé par
bacelar
"pure method called"
La Vtable (table des méthodes virtuelles) contient NULL pour la méthode virtuelle appelée.
En fait, il existe différente stratégies et en particulier un pointeur vers une fonction d'erreur appropriée (Quelle entrée pour les fonctions virtuelles pures ?).

Envoyé par
bacelar
Classiquement, les compilateurs ne remplissent pas la Vtable avant la fin du constructeur de la classe fille, donc un appel de méthode virtuelle dans un constructeur pose en problème car la Vtable n'est pas initialisé.
La vtable est construite à la compilation pour chacune des classes contenant des fonctions virtuelles. Ensuite, le vpointeur est initialisé juste avant l'entrée du constructeur pour référencer la table de la classe en cours de construction.

Envoyé par
bacelar
Dans le destructeur, c'est pareil.
La seule chose que dit la norme, c'est que dans le constructeur/destructeur la fonction virtuelle appelée est celle de la classe en train d'être construite/détruite. Conséquence : certains appels dans le constructeur/destructeur de fonctions virtuelles n'utilisent pas les vtables. (Les appels de fonctions virtuelles pures dans leur classe abstraite est un comportement indéterminé.). Cf tuto Les fonctions virtuelles en C++.
@kidpaddle2 : héritage == sémantique d'entité == pas de copie :
class Thread : private boost::noncopyable
Le cas que je vois pour expliquer ton erreur est que le destructeur a été déroulé et donc le vpointeur désigne la vtable de la classe abstraite. Bref, un problème de durée de vie de variable.
Partager