Aufruf der virtuellen Funktion von Destruktor

Ist dies sicher ?

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;

Dieser code crases manchmal mit der IP schlechte Adresse.

Dass ist keine gute Idee, aufrufen einer virtuellen Funktion auf der Konstruktor ist klar.

Aus Artikeln wie http://www.artima.com/cppsource/nevercall.html ich verstehen, dass der Destruktor ist auch ein nicht so guter Ort zum aufrufen einer virtuellen Funktion.

Meine Frage ist: "ist dies wahr ?" Ich habe getestet mit VS2010 und VS2005 und PrivateBase::Funktionsaufruf aufgerufen wird. Ist Undefiniertes Verhalten ?

InformationsquelleAutor der Frage cprogrammer | 2012-08-23

Schreibe einen Kommentar