2 verständnisfragen
-
1)wann sind destruktoren virtuell zu deklarieren? sobald eine virtuelle methode in der klasse ist?
2)wann benutzt man den konstruktor der basisklasse im konstr. der abgeleiteten klasse?
-
Original erstellt von <VesaMan>:
1)wann sind destruktoren virtuell zu deklarieren? sobald eine virtuelle methode in der klasse ist?
2)wann benutzt man den konstruktor der basisklasse im konstr. der abgeleiteten klasse?- ja. eigentlich schon. vieleicht aber viel eher, sobald es eine öffentliche basisklasse ist, denn bereits dann kann man mit delete speicherlochen. vielleicht sogar, wenn sie als basisklasse vorgesehen ist. oder gar, sobald sie vermutlich als basisklasse verwendet wird. oder gar, wenn sie als basisklasse verwendet werden könnte. irgendwo daszwichen liegts und bleibt einzelfallentscheidung. aber wenn virtuelle methoden abei sind, dann (bis auf krankhaft aussehende ausnahmen) bestimmt.
- immer. wenn du es nicht machst, macht's der compiler von allein.
-
zu 1) ja
zu 2) eigentlich wird der doch automatisch aufgerufen, oder?
der einzige Fall, der mir auf die Schnelle einfällt, wo die abgeleitete Klasse einen Konstruktor der Basisklasse aufruft, ist der Kopierkonstruktorda war wohl einer schneller
[ Dieser Beitrag wurde am 29.06.2003 um 12:38 Uhr von N00Bie editiert. ]
-
wenn der konstruktor der basisklasse parameter behaftet ist, dann muss er explizit am anfang des konstruktors in der abgeleiteten klasse aufgerufen werden. ansonsten pasiert das automatisch.
-
wenn der konstruktor der basisklasse parameter behaftet ist, dann muss er explizit am anfang des konstruktors in der abgeleiteten klasse aufgerufen werden. ansonsten pasiert das automatisch.
Bis zum ersten Punkt ist alles richtig. Der zweite Satz ist imo etwa missverständlich.
Deshalb nochmal:
Ruft ein explizit angegebener Konstruktor einer abgeleieteten Klasse in der Initialisierungsliste keinen Konstruktor der direkten Basisklasse auf, dann wird automatisch der Standard-Ctor dieser Basisklasse aufgerufen (ich übersehe absichtlich die Ausnahme die bei virtueller Vererbung eintreten kann).
Dies gilt für jeden Konstruktor und damit insbesondere auch für den Copy-Ctor.
Besitzt in diesem Fall die direkte Basisklasse keinen Standard-Ctor, so führt der Versuch die abgeleitete Klasse zu instanziieren zu einem Compile-Zeit Fehler.Ich schrieb explizit angegebener Konstruktor, da es bei implizit generierten noch eine Ausnahme gibt. Besitzt die Basisklasse einen Copy-Ctor, nicht aber die abgeleitete, so ruft der für die abgeleitete Klasse wenn nötig implizit generierte Copy-Ctor den Copy-Ctor (nicht den Standard-Ctor) der Basisklasse auf.
[ Dieser Beitrag wurde am 30.06.2003 um 11:16 Uhr von HumeSikkins editiert. ]