Frage zur Benutzung von new und delete bei einem Beispiel



  • ja, und du kannst, wenn es ein funktionsaufruf ist, nicht einmal garantieren, in welcher reihenfolge A und B konstruiert werden. wenn B::B fehlschlägt und nach A::A aufgerufen wird, dann gibt es keine möglichkeit mehr, das A-objekt freizugeben; foo wird auch niemals aufgerufen.



  • Hallo Arcoth,

    Arcoth schrieb:

    class Mammal 
    { 
    public: 
        virtual ~Mammal() =0;   // pure abstract; Instanz von Mammal ist nicht möglich! 
        virtual void Speak() const { std::cout << "???" << std::endl; } // Default 
    }; 
    inline Mammal::~Mammal() {}
    

    Warum nicht

    class Mammal 
    { 
    public: 
        virtual ~Mammal() = default;
        virtual void Speak() const = 0;
    };
    

    zu Speak: aus dem Beispielcode des TE ist meines Erachtens ersichtlich, dass es eine Default-Implementierung für die Methode Speak gibt. Das wollte ich dann genau so machen.
    zu ~Mammal: siehe Scott Meyers 'Effektiv C++' Item 14 "eine Basisklasse soll einen virtuellen Destruktor haben" und noch ein Item (wahrscheinlich aus 'Mehr Effektiv C++'), was ich jetzt nicht wieder finde, was besagt: "Mache Dir keine Instanzen von Basisklassen". Letzeres kann ich aus eigener (schmerzlicher!) Erfahrung bestätigen.

    Gruß
    Werner


Anmelden zum Antworten