Interfaces wie in Java?
-
Das virtuelle Ableiten ist an der Stelle nicht wirklich eine Hilfe. Implementiert man die maximale Geschwindigkeit als Variable (durchaus sinnvoll) wäre das virutelle Ableiten falsch (man hätte wieder nur eine maximale Geschwindigkeit im Attributsatz und nicht derer zwei).
Das mit dem Typecast und dem Erweitern der Basisklasse ist so eine Sache. Man sollte nie hingehen und Wissen (Variablen/Funktionen) die zu abgeleiteten Klassen gehören in die Basisklasse stecken. Ansonsten besitzen plötzlich andere abgeleitete Klassen Funktionen oder Variablen, die keinen Sinn ergeben.
Allgemeine Lösung:
class Fahrzeug { public: virtual int GetMaxGeschwindigkeit (EMedium eMedium = EMedium::eNix) const; };Nicht Mehrdeutig, kann immer einen Wert zurückliefern (gegebenenfalls 0 wenn es sich in dem Medium nicht bewegen kann) und auch auf Flugzeuge, Raumschiffe und UBoote anwendbar.

Typumwandlung um Sonderfälle zu behandeln, die die Schnittstelle der Basisklasse nicht abdeckt, sollte man soweit wie möglich vermeiden. (Würde bedeuten es überall und in alle Ewigkeit berücksichtigen zu müssen. Auf die Lebenszeit eines Programms gesehen fatal, weil sich dadurch immer mehr Sonderfälle ansammeln bis sie einem über den Kopf wachsen.)
-
Hallo!
Nur mal noch eine kleine Zwischenfrage
zu meinem ursprünglichen Thema:
Warum wird eigentlich ein virtueller Destruktor
der Basisklasse auch dann aufgerufen, wenn er
doch in der abgeleiteten Klasse redefiniert wurde?
Ich kann dort zwar problemlos einen leeren
Standarddestruktor implementieren, aber das sollte
einem ja auch einer sagen: ansonsten wird anscheinend
gar kein Destruktor ausgeführt, auch nicht der der
abgeleiteten Klasse!Alex
-
Destruktor wird immer ausgeführt, bei Vererbung von unten nach oben in der Hierarchie.
Virtual brauchst du, wenn du Polymorphie ausnutzt.
Wenn du z.B. einen Zeiger vomn Typ der Basisklasse hast, dieses aber auf eine abgeleitete Klasse zeigt, wird NUR der Konstruktor der Basisklasse beim Zerstören aufgerufen, wenn du kein virtual vorm Destruktor hast
-
OK, muss ich mir merken.
(hat ein weilchen gedauert, bis ich das rausgefunden hatte,
weil er im Debugmodus einfach nicht in in die delete-Operation
(sprich den Destruktor) reinspringen wollte...)
Danke,
Alex