Abgeleitete Klasse übergeben
-
Hallo,
ich hab ein Problem. Ich habe eine Klasse "Tier" von der "Katze" abgeleitet ist. Zusätzlich eine Methode, der ein Pointer auf ein Objekt vom Typ "Tier" übergeben werden kann. Z.B.
void Foo::bar(Tier *tier) {...};
In meiner Main-Klasse erzeuge ich nun ein Objekt vom Typ "Katze" und möchte einen Pointer darauf der Methode Foo::bar() übergeben. Leider sagt mir VS, dass es "Katze" nicht nach "Tier" konvertieren kann.
Was muss ich machen, um hier die "Katze" übergeben zu können?
Vielen Dank!
-
Wie immer gilt: Poste möglichst dein Problemprogramm (um unnötige Bestandteile reduziert!) und die exakte Fehlermeldung des Compilers. Sonst kann man höchstens ins Blaue raten ... hast du public abgeleitet oder nur private?
-
Hallo Bashar,
vielen Dank. Werde ich das nächste mal beachten. In diesem Fall habe ich übersehen, dass ich "Katze" per dynamic_cast nach "Tier" downcasten muss, bevor ich den zeiger übergebe. Ich komme von Java und da bin ich gewohnt, dass das automatisch per Übergabe geschieht
Schon wieder was dazu gelernt!Trotzdem vielen Dank!
Grüsse
Stephan
-
Steff schrieb:
In diesem Fall habe ich übersehen, dass ich "Katze" per dynamic_cast nach "Tier" downcasten muss, bevor ich den zeiger übergebe.
Das muss man aber nicht. Von Katze nach Tier wäre es ein «Upcast», denn man geht in der Hierarchie nach oben, vom Speziellen zum Allgemeinen. Das ist aber eine implizite Umwandlung, dafür ist kein Cast-Operator notwendig. Ein Downcast wäre von Tier zu Katze, dabei muss man sowohl in C++ als auch in Java casten (in Java kommt sowas übrigens wesentlich öfter vor.)
-
Polymorphie wir auch von C++ praktiziert
-
Aber warum hat der Kompiler ohne dynamic_cast gemäckert? Mit schluckt er es einwandfrei. Habe ich was falsch gemacht?
-
grmbl
Woher soll ich das wissen, wenn du weder Code noch Fehlermeldung bringst? Meine Kristallkugel ist leider grad unter der Dusche.
-
Hier hast du meine.
-
Hier der Code:
In der Header-Datei steht:
class Cell { private: Cell *cellPointer[26]; public: Cell (void); Cell (int position, Cell *child); Cell* getChild(int position); void setChild(int position, Cell *child); void setChar(char ch); virtual ~Cell(); virtual void display(); }; class Node : public Cell { private: int pageNumber; public: Node(int position, Cell *child); Node(); ~Node(); void setPageNumber(int pageNumber); int getPageNumber(); virtual void display(); };
In meiner Main-Klasse steht (so funktioniert es):
Node *child = new Node(); child->setPageNumber(pageNumber); cell->setChild(firstChar, dynamic_cast <Cell*> (child));
So funktioniert es nicht:
Node *child = new Node(); child->setPageNumber(pageNumber); cell->setChild(firstChar, child);
-
gcc (ich habe die Versionen 2.95.4 und 3.2.2 getestet) schluckt das «nicht funktionierende» Beispiel ohne zu Mucken (habe firstChar als char und cell als Cell* angenommen, ich hoffe das ist korrekt). Was genau sagt denn dein Compiler als Fehlermeldung? VC hab ich leider nicht greifbar ...
-
VC++ frisst es auch.
-
Müsste auch ein ziemlich komischer Compiler sein, wenn er nicht upcasten kann. Dann ist er für C++ leider unbrauchbar.