virtueller destruktor



  • Hilft mir ehrlich gesagt nicht:

    SceneObject ist jetzt die Basisklasse mit virtuellen Funktionen und protected Destruktor?
    Und AnimatedModel ist eine Ableitung davon?
    Und was ist jetzt der Vorteil davon (statt 'normalem' virtuellen Destruktor)?



  • Jockelx schrieb:

    SceneObject ist jetzt die Basisklasse mit virtuellen Funktionen und protected Destruktor?

    ja z.B.

    Jockelx schrieb:

    Und AnimatedModel ist eine Ableitung davon?

    ja

    Jockelx schrieb:

    Und was ist jetzt der Vorteil davon (statt 'normalem' virtuellen Destruktor)?

    Es geht nicht um irgendeinen Vorteil sondern darum zu demonstrieren dass hier nirgendwo über Basiszeiger deleted werden muss. Der der das Objekt erzeugt hat zerstört es auch wieder und er kennt das Objekt beim konkreten Typ und nicht nur über den Basiszeiger. Und das Beispiel ist jetzt nicht gerade an den Haaren herbeigezogen, sowas hat man eigentlich ziemlich oft. Gerade eine Factory ist eigentlich die einzige Möglichkeit Objekte zu erzeugen ohne ihren konkreten Typ zu kennen.



  • Mmh? Das ist doch gar nicht die Frage, dass man nicht immer über den Basiszeiger deleten muss.
    Das Problem ist doch, dass man deine SceneObjects nie über den Basiszeiger deleten kann.

    Und da frage ich mich: wo brauch man das?



  • Jockelx schrieb:

    Das Problem ist doch, dass man deine SceneObjects nie über den Basiszeiger deleten kann.

    Du siehst es falsch rum. Es macht keinen Sinn ein SceneObject über den Basiszeiger zu deleten und soll daher auch nicht möglich sein. Das Interface dient nur dazu verwendet zu werden. Die Verwaltung der konkreten Objekte passiert wo anders. Code der mit SceneObject arbeitet soll sich nicht darum kümmern was für konkrete Objekte dahinterstehen und wie sie erzeugt wurden. Dafür sind andere zuständig. Überleg mal was es genau bedeutet wenn du Code hast der ein Objekt über einen Basisklassenzeiger deleted. Damit sagst du: "Ich weiß zwar nicht was für ein Objekt das genau ist aber es muss mit new erzeugt worden sein"...
    Wenn ich sowas mach dann will ich sichergestellt haben dass solche Objekte nur mit new erzeugt werden können. In dem Fall verwend ich normalerweise folgendes Pattern:

    class MyObject
    {
    protected:
      MyObject() {}
      ~MyObject() {}
    
    public:
    
      virtual void DoSomething() = 0;
    
      virtual void Release() = 0;
    
    }
    
    class MyConcreteObjectA : public MyObject
    {
    private:
      MyConcreteObjectA() {}
      ~MyConcreteObjectA() {}
    
    public:
    
      static MyConcreteObjectA* create() { return new MyConcreteObjectA(); }
    
      void DoSomething() { ... }
    
      void Release() { delete this; }
    
    }
    

    Und da brauch ich erst recht keinen virtuellen Destruktor 😉



  • Nee, das legst du mir jetzt aber in den Mund, dass ich deine Interface-Struktur aufbrechen will.
    Aber okay, so langsam verstehe ich dein Beispiel.
    Du verhinderst mit deinem Design, dass man deine Interface-Struktur überhaupt aufbrechen kann.
    Okay, das ist vielleicht ganz gut. Andererseits darf so jemand auch gerne damit auf die Fresse fallen, wenn er fröhlich Pointer deleted, die er über eine Interface-Funktion kriegt.

    Dankeschön, war ganz interessant. Auch wenn du mich nicht überzeugen konntest, das zukünftig so zu machen.


Anmelden zum Antworten