Vererbung
-
Hallo,
ich arbeite nun das erste mal mit Vererbungen von Klassen.
Bin mir nicht ganz sicher, ob das so korrekt ist, wie ich es gemacht habe.Wir haben zunächst eine Klasse gehabt, mit der wir gearbeitet haben. Diese Klasse soll nun aber eine Basisklasse werden, und zwei weitere neue Klassen sollen nun von ihr erben.
Die Klasse FC.h enthält folgenden Quelltext
class FC { private: Direction dir; ID id; Move stopOrGo; Autopilot *pilot; Scanner *sc; Location loca; int waitTimer; public: FC(void); FC(const ID& id2, Location& loc, const Direction& direct); virtual ~FC(void); const ID& getID(); const Direction getDir(); void setDir(Direction newDir); const Location getLocation(); virtual void step() = 0; void test(); virtual void go() = 0; const Move getStopOrGo(); void setStopOrGo(Move m); void setWaitTimer(int timer); friend class Autopilot; friend class Scanner; virtual void hide() = 0; virtual void show() = 0; };So, wenn ich dies nun vererben will, ist das so korrekt?
SmallCar.h
class SmallCar : public FC { private: Direction dir; ID id; Move stopOrGo; Autopilot *pilot; Scanner *sc; Location loca; int waitTimer; public: SmallCar(void); SmallCar(const ID& id2, Location& loc, const Direction& direct); virtual ~SmallCar(void); const ID& getID(); Direction getDir(); void setDir(Direction newDir); Location getLocation(); virtual void step(); void test(); virtual void go(); Move getStopOrGo(); void setStopOrGo(Move m); void setWaitTimer(int timer); friend class Autopilot; friend class Scanner; virtual void hide(); virtual void show(); };Alle Methoden die von SmallCar benutzt werden, aber in FC bereits deklariert und implementiert wurden, müssen nun neu implementiert werden, richtig?
So wie ich es habe kompiliert es auch und funktioniert.
Allerdings habe ich ein Problem, wenn ich eine weitere Klasse vererben will
Bus.h
class Bus : public FC { private: Direction dir; ID id; Move stopOrGo; Autopilot *pilot; Scanner *sc; Location loca; int waitTimer; public: Bus(void); Bus(const ID& id2, Location& loc, const Direction& direct); virtual ~Bus(void); const ID& getID(); Direction getDir(); void setDir(Direction newDir); Location getLocation(); virtual void step(); void test(); virtual void go(); Move getStopOrGo(); void setStopOrGo(Move m); void setWaitTimer(int timer); friend class Autopilot; friend class Scanner; virtual void hide(); virtual void show(); };Bekomme ich beim kompilieren einen Fehler...
bus.cpp(39) : error C2664: 'Autopilot::Autopilot(SmallCar *,Scanner *)': Konvertierung des Parameters 1 von 'Bus *const ' in 'SmallCar *' nicht möglichKonstruktor der Klasse Bus, identisch mit SmallCar
Bus::Bus(const ID& id2, Location& loc, const Direction& direct) { loca.xAxis = loc.xAxis; loca.yAxis = loc.yAxis; dir = direct; w.setID(Location(loca.yAxis,loca.xAxis), ID(id2)); id = id2; stopOrGo = GO; sc = new Scanner(); pilot = new Autopilot(this, sc); waitTimer = 0; }Kann mir vielleicht jemand helfen?
LG
-
skizZ schrieb:
ich arbeite nun das erste mal mit Vererbungen von Klassen.
Dann würde ich aber ein einfacheres Beispiel schreiben. Also vielleicht zwei Member, und keine Zeiger. Das reicht ja völlig, um das Prinzip der Vererbung zu verstehen. Zudem hat es den netten Seiteneffekt, dass sich mehr Leute deinen Code anschauen.

skizZ schrieb:
So, wenn ich dies nun vererben will, ist das so korrekt?
Die Vererbungssyntax mit dem Doppelpunkt, ja. Also die Klasse
SmallCarist nun vonFCabgeleitet. Die Redeklaration der Membervariablen und -funktionen ist jedoch nicht nötig, siehe nächster Punkt.skizZ schrieb:
Alle Methoden die von SmallCar benutzt werden, aber in FC bereits deklariert und implementiert wurden, müssen nun neu implementiert werden, richtig?
Nein. Die Variablen und Funktionen, die schon in der Basisklasse vorhanden sind, musst du nicht noch einmal deklarieren und auch nicht definieren (es sei denn, du willst eine spezialisierte Funktion für die abgeleitete Klasse -> Verdeckung). Vererbung hätte ja keinen Sinn, wenn man alles von der Basisklasse noch einmal schreiben müsste.
skizZ schrieb:
Bekomme ich beim kompilieren einen Fehler...
Der Fehler sagt ja eigentlich bereits alles aus. Der
Autopilot-Konstruktor erwartet ein Argument vom TypSmallCar*, du übergibst aber einenBus* const. Erstens können diese Klassen nicht ineinander umgewandelt werden, da sie in der Vererbungshierarchie nicht in direkter Verbindung stehen. Sie haben zwar eine gemeinsame Basisklasse und können auch zu dieser konvertiert werden, aber nicht untereinander.Ausserdem ist der übergebene Zeiger konstant, der Parameter des Konstruktors aber nicht. CV-Qualifizierer können nicht ohne Weiteres von einer Variable entfernt werden.