L'appel de fonction virtuelle de destructeur

Est-il sécuritaire ?

class Derived:  public PublicBase, private PrivateBase
{
 ... 

   ~Derived()
   {
      FunctionCall();
   }

   virtual void FunctionCall()
   {
      PrivateBase::FunctionCall();
   }
}

class PublicBase
{
   virtual ~PublicBase(){};
   virtual void FunctionCall() = 0;
}

class PrivateBase
{
   virtual ~PrivateBase(){};
   virtual void FunctionCall()
   {
    ....
   }
}


PublicBase* ptrBase = new Derived();
delete ptrBase;

Ce code crases parfois avec la propriété intellectuelle dans une mauvaise adresse.

Qui n'est pas une bonne idée d'appeler une fonction virtuelle sur le constructeur est clair pour tout le monde.

Des articles comme http://www.artima.com/cppsource/nevercall.html je comprends que le destructeur est aussi un bon endroit pour appeler une fonction virtuelle.

Ma question est "Est-ce vrai ?" J'ai testé avec VS2010 et VS2005 et PrivateBase::FunctionCall est appelé. Est un comportement indéfini ?

  • Vous obtenez un comportement indéterminé de la suppression d'un pointeur vers la base où le destructeur n'est pas marquée virtual. Aussi, vous devriez avoir une ambiguïté entre les deux bases, puisque les deux fonctions ont la même signature - qui êtes-vous impérieuses? OIE, postez votre code réel, celui-ci n'a même pas compiler.
  • Désolé pour la confusion: le code réel est trop complexe, Dérivé n'est pas un destructeur virtuel, Les classes de Base n'ont.
  • Une fois qu'une classe est un destructeur virtuel, tous les objets qui héritent de il virtuel destructeurs, si le code de la montre ou pas. Personnellement, je préfère tapant l' virtual mot-clé, mais il est entièrement facultatif (il en va de même pour toute autre fonction virtuelle: les remplacements de la fonction virtuelle sera virtuels, qui se sont déclarées comme telles ou non dans le code).
  • Essayez primordial FunctionCall dans un TooDerived : pulic Derived classe. Qui ne sera pas appelé.
  • -1 Ce code ne compile pas en raison du manque de points-virgules. Ce n'est pas important en soi, mais cela signifie que c'est le code. Aussi, l'exemple est incomplètes, et, sur cette base, je vais voter pour fermer.
  • Qui semble exagérée. "Le code réel" n'est pas l'objectif sous-jacent; l'objectif est "de code qui sont sans ambiguïté illustre bien le coeur du problème" - dont ce code n'a clairement.
  • une bonne référence: wiki.sei.cmu.edu/confluence/display/cplusplus/...

InformationsquelleAutor cprogrammer | 2012-08-23