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