Destruktor Aufruf der Basisklasse aus abgeleiteter Klasse
-
Hallo!
Gibt es eine Möglichkeit, den Basisklassen-destrutkor aus dem destruktor der abgeleiteten klasse aufzurufen?
[cpp]
class basis
{
basis();
~basis() { //mach was
};
};class abg : public basis
{
abg() : basis() { ... };
~abg() { // hier soll jetzt basis::~basis aufgerufen werden };
};kann m,an das irgendwie bewerkstelligen?
gruß, Maxi
-
Sobald etwas vererbt wird sollte der d'tor virtual sein, dann passiert das automatisch..
-
Hallo,
wenn du den den Destruktor der Basisklasse virtual machst, wird automatisch immer der richtige Dtor aufgerufen. Oder meinstest du was anderes?
-
Der Dtor der Basisklasse wird automatisch aufgerufen.
Was nicht aufgerufen wird, ist der Dtor der abgeleiteten Klasse, wenn das Objekt über einen Zeiger/eine Referenz auf die Basisklasse angesprochen wird. In diesem Fall musst du den Basisklassen-Dtor virtuell machen.
Caipi
-
ALso wenn ich den destruktor der Basisklasse virtuell mache, dann wird immer der destruktor der basisklasse mit dazu aufgerufen? Auch, wenn ich ein abgeleitetes Objekt auf dem Stack oder so erstelle?
Noch was anderes, find ich voll komisch:
class CObject { public: static meResult RenderAll(const mePoint& rel); meResult DoRender(bool yes) { m_DoRender = yes; }; CObject(); virtual ~CObject(); protected: virtual meResult Render(); void ReleaseObject(); }; class CShip : public CObject { public: CShip(); virtual ~CShip(); protected: virtual meResult Render(); }; class CAttShip : public CShip { public: CAttShip(); ~CAttShip(); int GetRes() { return m_Res; }; virtual meResult Move(float PassedSecs); virtual meResult Init(int Type); virtual void GetDamage(float val) { m_Life -= val; }; private: }; // Wenn ich jetzt in Ship.cpp das mache: CAttShip::CAttShip() : CObject() {}; // kommt der Fehler: //Ship.cpp(111) : error C2614: 'CAttShip' : illegal member //initialization: 'CObject' is not a base or member
Kann mir das jemand erklären?
-
Der Destruktor der Basisklasse wird immer automatisch aufgerufen (ohne dass man irgendwas hinschreiben muss), nachdem der Destruktor der Oberklasse abgearbeitet ist.
Wird der Destruktor eines Basisklassenzeigers mittels delete aufgerufen, so kann nicht automatisch festgestellt werden, welche Oberklasse hinter dem Zeiger steckt. Deshalb muss in so einem Fall der Destruktor virtuell sein.
Willst Du keine virtuellen Destruktoren einführen, weil sie Dir zu "teuer" sind, so mach einfach die Destruktoren der Basisklasse(n) protected.
-
gut, das hab ich jetzt verstanden
Ich mach den dann wohl mal virtuell
Bitte beachtet auch mein editiertes Post weiter oben
-
CShip ist der Vorfahre, nicht CObject. Der Konstruktor für CObject kann nur von CShip gewählt werden in deinem Beispiel.
-
aber warum das denn? Warum darf ich denn nicht den konstruktor von CObject aufrufen?
Dann ist ja wohl die einzige Möglichkeit, den Aufruf nach unten weiterzuleiten, oder?
-
Weil der Vorfahre von CAttShip nunmal CShip ist. CShip ruft dann den Konstruktor von CObject auf. Du gehst sonst gleich zwei Ebenen nach unten.