Typ der abgeleiteten Klasse eines Objekts zur Laufzeit
-
Ich habe eine Basisklasse, von der zwei (oder auch mehr) Klassen abgeleitet sind. Ein Objekt einer abgeleiteten Klasse kann ja auch so erstellt werden:
Basisklasse* bk = new AbgeleiteteKlasse1();
Nun soll in einer Methode herausgefunden werden zu welcher abgeleiteten Klasse das Objekt gehört (also 'AbgeleiteteKlasse1', 'AbgeleiteteKlasse2' usw.), auf den der Zeiger zeigt. Ist das irgendwie möglich und wenn ja, wie?
(Falls jemandem eine WinAPI oder MFC Methode dafür einfällt, nehm ich die auch).
-
Kannst nen check mit typeid machen wenn RTTI an ist.
-
mal ne ganz blöde idee: könntest du nicht einfach in jede klasse eine methode einbauen:
virtual void ShowClass() { cout << "AbgeleiteteKlasse1"; }
oder
virtual string ShowClass() { return << "AbgeleiteteKlasse1"; }
und dann rufst du einfach
bk->ShowClass(); auf bzw machst
cout << "Klasse: " << bk-ShowClass();ist aber halt nur sone billiglösung, falls einem sonst nichts einfällt ^^
-
Hmmm, das mit typeid hab ich schon probiert... hat mir aber immer nur den Typ der Basisklasse geliefert. Aber vielleicht liegt das ja an dem Compilerschalter. Mal schauen, ob der eingeschaltet ist und ob's dann funzt.
-
Du musst den Zeiger dereferenzierererererreren!!111 wow
-
so sollte es eigenltich gehen (ohne gewähr - nicht getestet)
Basisklasse* bk = new AbgeleiteteKlasse1(); if(typeid(*bk) == typeid(AbgeleiteteKlasse1)) { // mach was }
-
Alternativ kann man auch dynamic_cast<> benutzen und dann natürlich die bad_cast Exception abfangen, wenn es nicht der gewünschte Typ ist.
void fpp(Basisklasse* bk) { try { AbgeleiteteKlasse1 *k1 = dynamic_cast<AbgeleiteteKlasse1*>(bk); // mach was } catch(const bad_cast& e) { std::err << e.what() << std::endl; } try { AbgeleiteteKlasse2 *k2 = dynamic_cast<AbgeleiteteKlasse2*>(bk); // mach was } catch(const bad_cast& e) { std::err << e.what() << std::endl; } }
EDIT: Oh man... 4x Änderungen.
-
bad_cast wird doch nur geworfen wenn du eine referenz anforderst und es nicht klappt. aber nicht bei zeigern
-
bad_cast wird doch nur geworfen wenn du eine referenz anforderst und es nicht klappt. aber nicht bei zeigern
Dann fragst du halt das Ergebnis auf 0 ab.
Deine Frage lässt allerdings befürchten das dein Design nicht zu deiner Aufgabe
"passt". Wenn du von vornherein wieder zu deiner abgeleiteten Klasse zurückmusst
ist die Arbeit mit den Basisklassenpointern vielleicht nicht der richtige Ansatz.
-
@FrodoSix
Schau dir nochmal DarkSea's Post an. In vielen Fällen reicht eine (oder mehrere) virtuelle Funktion aus. Das ist zudem eine bessere Lösung, als sich mit dynamic_cast oder typeid rumzuschlagen.