Frage zu dstor einer Abgeleiteten klasse und static int
-
Wurde schon gesagt. Objekte die du auf dem Stack anlegst, werden automatisch bei verlassen des Blockendes zerstört:
void foo() { MyClass a; if (blub) { MyClass b; // ... } // Destruktor von b wird aufgerufen } // Destruktor von a wird aufgerufen
In der Regel ruft man Destruktoren nicht explizit auf. Das funktioniert, weil man es manchmal -- im Umfeld von Placement new -- doch braucht, aber soweit bist du noch lange nicht.
-
ja das sie zerstoert werden, wenn scope verlassen wird ist klar!(kenn mich schon bisschen aus...)
Aber wie sieht es hier aus? (ACHTUNG:KEIN SINNVOLLES BEISPIEL, SOLL NUR ZUR VERANSCHAULICHUNG DIENEN!
int main(int argc, char* argv[]) { Member M; //mach was //jetzt soll M zerstoert werden.... //mach weiter mit was andrem return 0; }
steht in keiner funktion (ausser main....), hier muesste ich doch den dstor manuell aufrufen, oder blick ichs nich?
-
Dann setzt du manuell einen Block mit {} drum herum. Den Destruktor manuell aufrufen hilft dir hier so oder so nicht, weil er *trotzdem* noch am Ende von Main aufgerufen werden würde - dann also doppelt.
-
ok, also lieber klammern reinbauen, als dstor manuell aufrufen!
-
5er!al schrieb:
ok, also lieber klammern reinbauen, als dstor manuell aufrufen!
dtors ruft man NIE* selber auf
Ausnahme in Zusammenhang mit placement new
-
ich wollte doch ncih den destruktor protected machen, nur counter!
Doch, doch
Die Destruktoren von Basisklassen sollten entweder öffentlich und virtuell sein, oder nichtvirtuell und protected. Anderenfalls wären sie nicht wirklich als Basisklassen gedacht und man sollte es vermeiden, von ihnen abzuleiten...
Der Grund ist das polymorphe Verhalten, denn man kann mit einem Zeiger der Basisklasse auf ein Objekt einer abgeleiteten Klasse zeigen. Und diesen Zeiger kann man mit delete löschen. Ist der Desktruktor aber nichtvirtuell und öffentlich, dann wird nur der Desktruktor der Basisklasse aufgerufen, das Objekt wird nicht richtig zerstört. Wenn man das Löschen auf diese Art erlauben will, muss der Destruktor also virtuell sein, ansonsten macht man ihn protected (wodurch man die Basisklasse nicht mehr direkt verwenden kann, aber das ist i. d. R. sowieso eine schlechte Idee)...
-
Ja ich arbeite auch grad am thema klasse!
@kwaart: kannst mal ein beispiel für deine beiden fälle geben?
class bla { public: virtual bla() protected: };
class bla { public: protected: bla(); };
meinst du wohl nich?!
-
Ja ich arbeite auch grad am thema klasse!
@kwaart: kannst mal ein beispiel für deine beiden fälle geben?
class bla { public: virtual bla() protected: };
class bla { public: protected: bla(); };
meinst du wohl nich?!
-
Ich meine das hier:
class Base { public: //... virtual ~Base(); //... }; class Derived: public Base { // ... }; // ... Base* pointer = new Derived; // ... delete pointer;
Damit dieses delete korrekt arbeitet, muss der Destruktor von Base virtual sein. Alternativ, wenn du deine abgeleiteten Klassen sowieso nicht über Pointer der Basisklasse löschen willst, dann mach den Destruktor protected, und obiger delete-Aufruf ist nicht länger erlaubt.
-
hm...also ich habs ohne virtual versucht, funktioniert 1a.....
wieso steht sowas aber nicht in meinen buechern und tutorials, das der dstor virtuel sein sollte?