Polymorphismus



  • Hallo,

    bitte entschuldigt immer für diese Anfängerfragen, aber ich beschäftige mich momentan mit Polymorphismus.

    Vor kurzem hab ich unter dem Thema Vererbung gelesen, dass man bei Basisklassen und abgeleiteten Klassen die Destruktoren weglassen kann... Also speziell jetzt bei Basisklassen, da hier der Destruktor automatisch aufgerufen wird.
    Jetzt unter dem Kapitel Polymorphismus lese ich, dass man normalerweise den Destruktor der Basisklasse virtual deklariert...

    Und jetzt meine wohl äußerst dumm erscheinende Frage: Warum denn überhaupt in der Basisklasse den Destruktor virtual deklarieren, wenn ich doch sowieso vererbe und bei diesem Konzept ja die Destruktoren generell weglassen sollte?

    Mal wieder danke für eure Hilfe!

    LG
    Nadine



  • wieso sollte mann denn die destruktoren auslassen?
    wo willste denn sonst den scheiß aufräumen den du möglicherweise allokiert hast?



  • ^^gehören destruktoren nicht der vergangenheit an *fg*? um welche art von OOP geht es denn?



  • hm... also ich kann nur sagen was in meinem "schlauen" buch steht. d. h. unter dem kapital vererbung hieß es, dass destruktoren nicht explizit definiert werden müssen, da das der compiler übernimmt. ich ging einfach mal davon aus, wenn das im skript meines profs und auch in dem buch steht, wird das wohl so für die vererbung stimmen.
    nachdem ich jedoch zum polymorphismus kam und hier genau so in beispielprogrammen von einer basisklasse an eine abgeleitete klasse vererbt wurde, wurde ich ein bisschen stutzig, denn auf einmal waren trotz der vererbung destruktoren vorhanden.

    also ich hab gestern nochmal ein bisschen im netz gestöbert. was ich da jetzt nachgelesen habe, hab ich das nun soweit verstanden, dass ich grundsätzlich keine destruktoren brauche... also d. h. auch nicht unbedingt beim polymorphismus. lediglich wenn ich dynamische objekte habe, werden destruktoren eingesetzt. ansonsten werden nicht zwingend destruktoren benötigt, da der compiler doch so schlau ist 😉 dass er das für mich erledigt.

    richtig so?

    LG



  • Ich gehe mal von C++ aus (d.h. du hättest eher im entsprechenden Unterforum posten sollen)...

    Bei polymorphen Klassen sollten die Destruktoren als "virtual" deklariert sein, damit auch von abgeleiteten Klassen der Destruktor aufgerufen wird (falls man ein Objekt nur als Zeiger oder Referenz des Basisobjektes zur Verfügung hat).
    Standardmäßig erzeugt der Compiler zwar den notwendige Destruktor, jedoch immer als "nicht-virtuell", daher muß man ihn für Basisklassen explizit als virtuell deklarieren und definieren.

    Hier ein Beispiel:

    class Base
    {
    public:
      virtual ~Base() {} // deklarieren und definieren (d.h. leerer Body)
    };
    
    class Derived : public Base
    {
    public:
      Derived()
        : x(new X())
      {}
    
      virtual ~Derived() { delete x; } // virtual kann hier auch entfallen, da ~Base schon virtual ist
    
    private:
      X *x;
    };
    
    Derived *d = new Derived();
    
    Base *b = d;
    
    delete b; // <-- s.u.
    

    Ohne das "virtual" in der Base-Klasse würde nicht der Destruktor von Derived aufgerufen werden!

    Ich hoffe, du kannst hiermit etwas anfangen...

    Und hier noch ein anderer Link aus diesem Forum:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-242855-and-highlight-is-virtual+polymorphie.html


Log in to reply