Automatisches aufrufen der Destruktoren der abgeleiteten Klassen anstatt der Basiskla
-
Hi Leute,
hab zur Abwechslung mal ein Problem.
Also ich habe einen größeren Aufbau:Es gibt SObject als Basisklasse und SStatObject als abgeleitete Klasse (es werden noch mehr hinzu kommen später).
Nun habe ich einen vector auf SObject*, damit ich sowohl SStatObjecte und SDynObjecte (kommen noch) hineinspeichern kann.
Ich habe jetzt auf folgende Weise versucht den Vector zu leeren und zu löschen:for(iterator = map.begin(); iterator != map.end(); ++iterator) delete *iterator; map.clear();
Da ich als Objekt einen Zeiger habe, muss ich explizit alle Elemente löschen.
Der Code wirft jetzt bei mir den Fehler:Original erstellt von Microsoft Visual C++ 6.0 Professional Edition
error C2248: "SObject::~SObject" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "SObject" erfolgteDer Destruktor ist protected und rein virtuell.
Setze ich den Destruktor public geht es.
Mich wundert jetzt nur, weshalb der Compiler ~SObject public haben möchte.
Mir wäre es eigentlich lieb, wenn ich ohne Änderungen den Destruktor für SStatObject oder SDynObject aufrufen könnte, automatisch geschieht dies ja offensichtlich nicht.MfG MAV
-
Wenn du einen vector<SObject*> hast, und die darin enthaltenen Zeiger deleten willst, mußt du Zugriff auf den Destruktor von SObject haben. Eigentlich klar oder? Was ist das Problem?
-
Er soll automatisch entweder den Konstruktor von SStatObject oder von SDynObject aufrufen, je nachdem was das Teil gerade ist, ein SObject* kann ja mit new SStatObject und new SDynObject erstellt werden, aber am Ende soll er dann halt auch den jeweiligen Destruktor aufrufen...
Macht er das?
Scheint mir nämlich nicht so, weil er ja von ~SObject redet.Danke schon mal
mfG MAV
-
du hast ja nur zeiger auf SObjecte (mehrzal e)
woher soll der compiler zur kompilierzeit denn wissen, dass sich hinter den SObject keine SObject*e sondern irgendwas anderes befindet?
gar nicht. und daher nimmt er auch den dtor von sobjekt der durch Polymorphie dann zur laufzeit in den "richtigen" aufgelöst dtor aufgelöst wird.rein virtuelle dtoren brauchen übrigens auch einen funktionskörper
-
Im übrigen welchen Zweck sollte ein Protected Destructor erfüllen ?
Devil
-
der zweck ist, dass man keine auto.objekte erstellen kann
und freestore objekte nicht löschen kannaußer man ist abgeleitet...
ansonsten aber denke ich ist es ziemlich derselbe, wie wenn ich eine rein virtuelle funktion deklariere[ Dieser Beitrag wurde am 09.06.2003 um 21:27 Uhr von davie editiert. ]
-
OK ich habe verstanden!
Danke für die Erklärung.