PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Frage zu abgeleiteten Klassen Implementationen und Cast auf Referenzen


mekakic
2009-07-21, 17:35:06
Hallo

Ich habe eine Basisklasse A und zwei abgeleitete Klassen B & C. Kann ich mit C++ eine Instanz von Klasse A auf dem Stack anlegen, die per Referenz an eine Funktion übergeben und in der Funktion entscheidet sich dann erst wie diese Instanz ausgeprägt wird - also nach B oder C - aber halte das Objekt dann in der Referenz auf A? Ich habe aber ja erst für "A" Speicher zusammen. Wie geht man da vor?

Bzw. im Prinzip sind da zwei Fragen drin:
Kann ich eine Referenz hoch-casten? Ich habe häßlicherweise mal für den fraglichen Speicher gesorgt (A & a = *new B();) beim (B & b = dynamic_cast<B&>(a)) bekomme ich eine bad_cast Exception. IOder ist das Problem woanders?

Und kann ich dieses Problem lösen, sich erst den Speicher für den Basis Typ zu holen und wenn man weiß was man will, vergrößert man den Speicher hinter einer Referenz oder einem Pointer zu einem vollständigen abgeleiteten Objekt? Die Basisklasse soll schon existieren, auch wenn sich noch nicht weiß, was sie später mal machen will.

Trap
2009-07-21, 17:46:23
Das was du willst geht so direkt nicht.

Du kannst einen Pointer nehmen, das Objekt auf dem Heap erzeugen, eine Referenz auf den Pointer übergeben, das Objekt löschen und ein neues von der richtigen Klasse erzeugen.

Bestehende Objekte können die Klasse in C++ nicht wechseln.

mekakic
2009-07-22, 12:58:52
Okay danke, ich habe es jetzt so gehandhabt, daß ich das ganze auf Doppelpointer zu Klasse A umgebaut habe und es damit auch zum funktionieren bekommen. Eigentlich mag ich keine Doppelpointer**, ich glaube es gab noch keinen Fall wo ich bei deren Verwendung das einfach runtergecoded habe und kein Fehler drin war.

Wenn die Entscheidung ansteht wie das Objekt aussehen wird, wird eine Instanz aufgebaut und die Basismember werden kopiert. Kann ich eigentlich den Copy Konstrutkor auch irgendwie auf der abgeleiteten Klasse ausführen, wenn er in der Basis definiert ist oder muß ich dazu es in jeder Implementation aufführen?

Also die Klasse A hat einen Ctor A::A(const A& t) : i(t.i) {} definiert. Muß ich auch in jeder abgeleiteten Klasse den Ctor so definieren B::B(const A& t) : A(t) {}
um eine abgeleitete Klasse mir ihren Basismembern zu initialisieren oder gibt es da einen direkten Weg, wie das automatisch geschieht, wenn ich eine Implementation mit einer Referenz auf ihre Basisklasse baue?

Xmas
2009-07-25, 13:06:14
Bzw. im Prinzip sind da zwei Fragen drin:
Kann ich eine Referenz hoch-casten? Ich habe häßlicherweise mal für den fraglichen Speicher gesorgt (A & a = *new B();) beim (B & b = dynamic_cast<B&>(a)) bekomme ich eine bad_cast Exception. IOder ist das Problem woanders?
dynamic_cast erfordert dass die Klasse polymorph ist, also mindestens eine virtual-Methode hat. Ansonsten sollte das problemlos funktionieren.

Okay danke, ich habe es jetzt so gehandhabt, daß ich das ganze auf Doppelpointer zu Klasse A umgebaut habe und es damit auch zum funktionieren bekommen. Eigentlich mag ich keine Doppelpointer**, ich glaube es gab noch keinen Fall wo ich bei deren Verwendung das einfach runtergecoded habe und kein Fehler drin war.
Wenn du ändern willst auf welches Objekt eine externe Referenz zeigt, kommst du ja um Doppel-Pointer/Refernzen nicht herum.

Wenn die Entscheidung ansteht wie das Objekt aussehen wird, wird eine Instanz aufgebaut und die Basismember werden kopiert. Kann ich eigentlich den Copy Konstrutkor auch irgendwie auf der abgeleiteten Klasse ausführen, wenn er in der Basis definiert ist oder muß ich dazu es in jeder Implementation aufführen?

Also die Klasse A hat einen Ctor A::A(const A& t) : i(t.i) {} definiert. Muß ich auch in jeder abgeleiteten Klasse den Ctor so definieren B::B(const A& t) : A(t) {}
um eine abgeleitete Klasse mir ihren Basismembern zu initialisieren oder gibt es da einen direkten Weg, wie das automatisch geschieht, wenn ich eine Implementation mit einer Referenz auf ihre Basisklasse baue?
Wenn du die Daten der zu kopierenden Referenz während des Konstruktors benötigst, musst du den Konstruktor für jede Klasse von Hand definieren. Ansonsten könntest du einfach operator=(const A& t) in A definieren und dann B* b = new B(); *b = a; schreiben.

Gast
2009-08-09, 00:30:52
Ist nicht direkt zum Thema, aber so ähnlich:

Ich habe eine Klassenhierachie mit Basisklasse A und abgeleitete Klassen B,C,D,E usw.
Jetzt habe ich eine Methode die mit allen von A abgeleiteten Klassen umgehen können soll, also nehme ich als Parameter einen Pointer vom Typ A. Jetzt gibt es aber eine andere Methode mit der ich mir die zuvor übergebenen Klassen wieder heraushole, und das was ich herausbekomme ist jetzt natürlich immer vom Typ A. Ich möchte aber etwas vom Typ B oder C herausbekommen, je nachdem was ich vorher hineingegeben habe. Geht das ohne cast? Wenn nein, welchen (static, dynamic oder gar reinterpret) nehme ich da?

lg