uebung zu virtueller vererbung
-
ich suche momentan ein kleines einfaches beispiel zu virtueller vererbung, sollte recht simpel (bitte nicht die iostream klassen)
was sagt ihr zu meinem beispiel..
class Human { public: Human() {} //virtual ~Human() {} //virtual int eat() = 0; //virtual void move() = 0; //virtual void sleep() = 0; ulong getpower() { return _power; } bool getsex() { return _sex; } protected: uint _age; uint _height; uint _iq; uint _weight; private: ulong _power; bool _sex; }; class Mum : virtual public Human { }; class Dad : virtual public Human { }; class Child : public Mum, public Dad { };
mfg leo
-
was sagt ihr zu meinem beispiel..
Totaler Käse und das in zweierlei Hinsicht. Zum einen drückt Vererbung eine statische Eigenschaft aus. Vater bzw. Mutter zu sein ist aber eine dynamische Eigenschaft. Menschen werden mit der Zeit erst zu Müttern bzw. Vätern.
Sie kommen nicht als solche auf die Welt.
Zum Anderen verwechselst du die "hat-ein"-Beziehung mit der "ist-ein"-Beziehung. Vererbung modelloiert "ist-ein". Ein Kind hat aber erstmal nur
eine Mutter und einen Vater. Ein Kind *ist* aber keine Mutter und Vater. Ein Kind kann ein Elternteil werden (-> dynamische Veränderung). In der Regel aber nicht ein Vater und eine Mutter gleichzeitig.In einer Welt ohne Geschlechtsumwandlung kannst du Mensch, Frau und Mann in eine Vererbungsbeziehung setzen. Frau und Mann hätten jeweils zwei Member Mutter bzw. Vater. Hier also Komposition statt Vererbung. Kind an sich ist imo keine sinnvolle Klasse. Eher eine Rolle. Genau wie Vater und Mutter.
Virtuelle Vererbung resultiert in der Regel aus technischen Zwängen. Natürliche Beispiele sind eher selten zu finden.
-
Ein halbwegs brauchbares Beispiel (weiß nicht mehr, wo ich das aufgeschnappt habe) wäre folgendes:
class Fahrzeug { // alles, was ein Fahrzeug benötigt } class Boot : virtual public Fahrzeug { // Spezialmethoden für's Schwimmen } class Auto : virtual public Fahrzeug { // Spezialmethoden zum Fahren auf dem Festland } class Amphibienfahrzeug : public Boot, public Auto { // kann wahlweise schwimmen oder fahren }
-
CS schrieb:
Ein halbwegs brauchbares Beispiel (weiß nicht mehr, wo ich das aufgeschnappt habe) wäre folgendes:
class Fahrzeug...
jup. und das noch aufmotzen mit double masse in Fahrzeug und double geschwindigkeit jeweils in Boot und Auto. und feststellen, daß geschwindigkeit zweifach sein muß, weil je nach rolle ne andere gilt und daß masse einfach sein muß.
-
volkard schrieb:
CS schrieb:
Ein halbwegs brauchbares Beispiel (weiß nicht mehr, wo ich das aufgeschnappt habe) wäre folgendes:
class Fahrzeug...
jup. und das noch aufmotzen mit double masse in Fahrzeug und double geschwindigkeit jeweils in Boot und Auto. und feststellen, daß geschwindigkeit zweifach sein muß, weil je nach rolle ne andere gilt und daß masse einfach sein muß.
Cool. Gerade habe ich eine ähnliche Antwort von dir in de.comp.lang.c++ gelesen. Und das war schon 1998
-
Nehme mal an Geschwindigkeit soll die maximal erreichbare Geschwindigkeit sein?
*sie dann auch mal so nennt*Die maximal erreichbare Geschwindigkeit ist vom Antrieb abhängig und nicht vom Fahrzeug. Da ein Amphibienfahrzeug zwei Antriebe besitzt hat sie auch zwei maximal erreichbare Geschwindigkeiten.
Ein Problem stellt dies nur dann da, wenn man voraussetzt, dass ein Fahrzeug immer nur exakt einen Antrieb besitzt und dies ist ein Design-Fehler (und kein Prob der Mehrfachvererbung)....
-
Mathias schrieb:
Nehme mal an Geschwindigkeit soll die maximal erreichbare Geschwindigkeit sein?
*sie dann auch mal so nennt*ok, fehler von mir.
Die maximal erreichbare Geschwindigkeit ist vom Antrieb abhängig und nicht vom Fahrzeug. Da ein Amphibienfahrzeug zwei Antriebe besitzt hat sie auch zwei maximal erreichbare Geschwindigkeiten.
Antrieb ist ein Hilfkonstrukt.
Ein Problem stellt dies nur dann da, wenn man voraussetzt, dass ein Fahrzeug immer nur exakt einen Antrieb besitzt und dies ist ein Design-Fehler (und kein Prob der Mehrfachvererbung)....
ich hab nen see mit vector<Boot*> und ne autobahn mit vector<Auto*> und wenn ich ein ding auf der autobahn nach der maxGeschwindigkeit fragen will, frage ich einfach und es antwortezt korrekt. willst du das mit den antrieben veriffeln?
-
Das ist ein Hilfskonstrukt wie jede andere Klasse auch. Eine vereinfachte Abbildung der Realität. :p
Es gibt Antriebe, die funktionieren an Land, im Wasser, in der Luft und/oder im Weltraum. Um die aktuell maximal mögliche Geschwindigkeit abfragen zu könnnen muss man wissen wo sich das Fahrzeug aktuell befinden und welche Antriebe hierfür geeignet sind. (Kann man einmal allgemein für alle Fahrzeugarten machen.)
Nehmen wir z.B. das Amphibienfahrzeug dieses kann über einen Radantrieb und einen Schiffspropeller verfügen. In dem Fall hat das Fahrzeug 2 Maximalgeschwindigkeiten.
Welche gibt man aus, wenn nicht die aktuelle Position des Fahrzeugs bekannt ist?
Man kann das natürlich mit 2 Funktionen hartkodieren, damit kriegt man aber keine allgemeine Schnittstelle hin.
Viel Schlimmer wirds noch beim Luftkissenboten. Die können an Land oder auch im Wasser fahren, sind somit Amphibienfahrzeuge aber haben nur einen Antrieb aber unter umständen mehrere Motoren.
Eine allgemeinen Funktion zur Ermittlung der maximalen Geschwindigkeit wird daher die aktuelle Position (Land, Wasser, Luft, Weltraum) oder auch See, Autobahn, Landstraße, ... mit uebergeben werden müssen.
(Wer kann die max. Geschwindigkeit besser berechnen als das Fahrzeug selbst...)
-
Mich hat
class Fahrzeug..
auf den ersten Blick an ein Beispiel erinnert, an welchem ich die Gefahren der Mehrfachvererbung(Schattenobjekte), gezeigt bekommen habe
-
bool getsex() { return _sex; }
Geile Mett-Hode!