Überschreiben von Methoden: Falsche Methode wird aufgerufen!



  • Hi,

    ich habe da eine Basisklasse List und eine abgeleitete Klasse intList.
    Die Methode DeleteData wird im Destruktor der Klasse List aufgerufen, um den Speicher aufzuräumen.
    In der Klasse intList überschreibe ich diese Methode DeleteData.
    In meinem Hautprogramm erstelle ich nun ein Objekt vom Typ intList.
    Wird am Schluss des Hauptprogramms Destruktor von intList aufgerufen, erwarte ich, dass DeleteData von intList und nicht von List aufgerufen wird. Aber das Gegenteil ist der Fall.

    Wo ist mein Denkfehler?

    // -- Basisklasse List --
    
    class List
    {
      ...
      public:
        virtual bool DeleteData(void* Data);
        ~List();
    };
    
    bool List::DeleteData(void* Data)
    {
      printf("Aufruf der Methode der Basisklasse\n");
    }
    
    List::~List()
    {
      ...
      DeleteData(data);
      ...
    }
    
    // -- Abgeleitete Klasse IntList --
    
    class IntList : public List
    {
      public:  
        virtual bool DeleteData(void* Data);
    };
    
    bool IntList::DeleteData(void* Data)
    {
      printf("Aufruf der Methode der abgel.Klasse\n");
      delete((int*) Data);
    }
    


  • zu dem zeitpunkt, wenn der destruktor von List aufgerufen wird, ist der destruktor von IntList schon aufgerufen worden. die IntList gibt es dann nicht mehr und deshalb kannst du auch keine methoden dieser klasse mehr verwenden. was IntList an speicher besorgt (wahrscheinlich im ctor), muss IntList im dtor auch wieder freigeben.



  • Btw: Basisklassendestruktoren sind am Besten entweder public und virtual oder protected und non-virtual. Public und non-virtual ist käse, da dynamische Objekte dann nicht polymorph freigegeben werden können.


Anmelden zum Antworten