titel
-
nachrichtentext
-
den virtuellen destruktor aus der basisklasse kannst du in einer abgeleiteten klasse nicht neu definieren. abgesehen von dieser begrifflichen unklarheit, hat deine abgeleitete klasse einen vom compiler automatisch generierten destruktor, der den destruktor deiner basisklasse aufruft, nachdem er die destruktoren aller elementvariablen der abgeleiteten klasse aufgerufen hat.
wenn du z.b. in der abgeleiteten klasse mit dynamischen speicher arbeitest, wirst du diesen in der regel auch im destruktor ebendieser klasse freigeben müssen.
-
nachrichtentext
-
ah ok. das bedeutet, ich brauche nur einen destruktor in der basisklasse als virtuell deklarieren und in den abgeleiteten klassen wird automatisch der richtige automatische destruktor (der abgeleiteten klasse) aufgerufen?
Es werden alle Destruktoren aufgerufen.
Beispiel:class Foo { public: virtual ~Foo(){} }; class Bar: public Foo { }; //. //. int main() { { Bar bar; } // hier wird erst der (implizit angelegte) Destruktor von Bar aufgerufen, anschliessend der von Foo }
Wuerdest du in Bar dynamisch Speicher anfordern, musst du ihn auch in ~Bar() freigeben (logisch, denn Foo weiss ja hoechstwahrscheinlich nichts davon).
wann ist es dann sinnvoll, den destruktor der basisklasse als virtuell zu deklarieren?
Sobald Vererbung ins Spiel kommt wirst du hoechst wahrscheinlich den Basisklassendestruktor virtual machen wollen (und damit sind auch alle weiteren Destruktoren implizit virtual).
-
nachrichtentext
-
Torboe schrieb:
zb char* name.
so eine variable willst du bestimmt überhaupt nicht. in c++ benutzt man std::string. und wenn du das noch nicht kennst, informier dich auch über std::vector, std::map usw.
du wirst staunen, wie viel drecksarbeit c++ dir abnehmen kann, wenn du erst mal damit aufgehört hast, in c zu programmieren.
-
Torboe schrieb:
wann muss ich in einer abgeleiteten ...
edit: vermutlich immer dann, wenn ...
edit2: ah... ich glaub ich hab die antwort ...Es gibt kein Kochrezept dafuer. Sprachelemente haben Sinn, Zweck und Bedeutung (zumindestens in C++), versuche diese drei Sachen zu erfassen.
-
wann muss ich in einer abgeleiteten klasse den kopierkonstruktor und zuweisungsoperator deklarieren und definieren?
Müssen tust du gar nichts.
Was du solltest, ist aber dir immer im klaren sein, wie sich dein Programm verhält in gewissen Situationen. Schwierig ist das in den 99% der Laufzeit deiner Klasse wahrscheinlich nicht. Aber im restlichen 1%, wo kopiert, zugewiesen und exceptions geschmissen werden. Und da solltest du dir dann Gedanken machen, was passiert, wenn. (Und wenn möglich natürlich testen und überwachen, ob es sich so verhält, wie du willst.)