Destruktor erbender Klasse wird aufgerufen? Warum?



  • Hallo,

    ich bin etwas verwirrt. Ich habe eine KLasse die von einer anderen erbt. Instantiiere ich diese Klasse lokal auf dem stack wird der destruktor nicht der eigenen klasse sondern der der klasse aufgerufen von der geerbt wird - warum ist das so und wie kann ich das umgehen? Umgehen weil damit auf member im destruktor zugegriffen wird die gar nicht gesetzt sind und damit ein seg-fault entsteht....

    Bsp.:

    class myClass
    {
        public:
            myClass(int len_p) 
           { 
               len = len_p
            };
    
            ~myClass()
             {
                 // hier wird auf den member len
                 // zugegriffen der aber für myClass2 nicht
                 // gesetzt ist.
                  for ( int i = 0; i < len; i++)
                    foo();
             };
    
           void func() { // do something 
              };
    
           int len;
    };
    
    class myClass2 : public myClass
    {
        public: 
            bar() { std::cout << "hallo" << std::endl; };
    
    };
    
    // irgendwo in der main z.B.
    
    myClass2 mc2;
    mc2.func();
    
    // wird die main verlassen wird mc2 zerstört und seltsamerweise der destruktor von myClass aufgerufen? 0
    

    😕



  • ok wie gerade gelesen schein das so gewollt zu sein - nur wie kann ich das umgehen dass der destruktor der basisklasse nicht aufgerufen wird? MUss ich dazu die vererbung meiden also wieder rausnehmen? gibt es kein hilfsmittel um den destruktor der basisklasse NICHT aufrufen zu lassen?


  • Administrator

    Weil ein MyClass2 Objekt auch ein MyClass Objekt ist. Wenn also das MyClass2 Objekt zerstört wird, dann wird auch das MyClass Objekt zerstört. Destruktoren werden immer so aufgerufen, was auch Sinn macht. Deshalb sollte man bei Veerbung den Destruktor auch virtual machen. Damit der Basisdestruktor and den am weitesten abgeleiteten Destruktor übergibt. Von dort wird das Objekt dann Klasse für Klasse in der Hierarchie rückwärts abgebaut.

    Es gibt keine Möglichkeit dies zu umgehen und es macht auch absolut keinen Sinn, sowas umgehen zu wollen.

    Grüssli



  • Das ist ganz normales Verhalten und auch gut so. Die abgeleitete Klasse heinhaltet ja die Basisklasse und somit auch alle Member. Der ctor der Baisklasse wird aufgerufen und daher muss der dtor ebenfalls aufgerufen werden.

    Allerdings glaube ich nicht, dass das kompiliert, da du gar keinen Konstruktor für die Basisklasse aufrufst. Und allgmein ist dein Code voller Fehler. Ist es denn so schwer ein funktionierendes Beispiel zu posten?

    Wenn dein Code nämlich überhaupt sinnvoll wäre, dann wäre auch der Aufruf des Destruktors kein Problem.


Anmelden zum Antworten