4 Stimmen

Indirekter Aufruf einer virtuellen Funktion aus dem Destruktor

Lassen Sie mich diesen Haftungsausschluss machen: Ich habe ein klares Verständnis für den Aufruf virtueller Funktionen im Konstruktor oder Destruktor.

In dem untenstehenden Code versuche ich aus experimentellen Gründen, einen virtuellen Destruktor zu vermeiden.

Jetzt ist meine Frage:

In der main-Funktion ruft der Aufruf der Destroy-Funktion die richtige virtuelle Funktion auf. Ich erwarte, dass jeder Aufruf der Destroy-Funktion die richtige virtuelle Funktion aufruft.

Aber dieselbe Destroy-Funktion im Basiskonstruktor ruft die basierte virtuelle Funktion auf.

Hängt das mit statischer Bindung oder Compiler-Optimierung zusammen?

class Base
{
public:
      Base()
      {
      }
      void Destroy()
      {
            callVirtual();
      }
      virtual void callVirtual()
      {
            cout<<"In Base callVirtual "<

``.

class Derived : public Base
{
   public:
           Derived()
           {
           }
           void callVirtual()
           { 
               cout"<

`.

int main()
{
    Base *pointer = new Derived();

    pointer->Destroy();    // Ruft die richtige callVirtual-Funktion auf

 return 0;

}` ``

6voto

Oliver Charlesworth Punkte 259497

In einem Destruktor ist der dynamische Typ von this der der aktuellen Klasse und nicht der ursprüngliche dynamische Typ des Objekts. Siehe z.B. http://www.artima.com/cppsource/nevercall.html.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X