abgeleitete Klassen und Alternative zu typeid?



  • hi,

    ich hab eine Basisklasse A und eine mehrere davon abgeleitete Klassen B/C.
    Ich speichere in meinem Programm nun eine Liste mit Zeigern auf Basisklassen. In diese Liste kann man natürlich auch die abgeleiteten Klassen eintragen. Wenn ich dann Elemente aus der Liste auslesen möchte, erhalte ich ja Zeiger auf eine Basisklasse.
    Nun stellt sich mir das Problem wie ich herausfinde, ob der Zeiger nun wirklich auf eine Basisklasse A oder auf eine der abgeleiteten Klassen B/C zeigt.
    Mit typeid bekomme ich zwar Informationen zu einer Klasse, aber wenn ich dem typeid-Operator einen Zeiger auf eine abgeleitete Klasse B/C übergebe, bekomme ich die typeid-Informationen der Basisklasse A. D.h. typeid geht in meinem Fall nicht.
    Gibt es nun - in diesem Fall funktionierende - Alternativen zu typeid?

    Danke! 👍



  • Hab da mal was gelesen mit casts ..

    if (B* b = dynamic_cast<B*>(a)) {
    	// amch was mit b
    } else if (C* c = dynamic_cast<C*>(a)) {
    	// mach was mit c
    }
    

    dynamic_cast gibt im Fall, dass a der gecasten Unterklasse angehört, einen Zeiger zurück, sonst NULL.
    Hab's allerdings nicht getestet. 😃



  • afaik wirft es eine Exception bad_cast und liefert nicht 0 😕

    MfG SideWinder



  • Nur bei Übergabe von Referenzen kann bad_cast geworfen werden. Bei Übergabe eines Pointers wird 0 zurückgeliefert, falls der cast fehlschlägt.



  • Danke, funktioniert prima! 👍



  • Eine solche Lösung ist allerdings nicht besonders glücklich.

    Jedesmal wenn eine Klasse dazukommt muß man irgendwo nen zusätzlichen Fall in nem switch oder so eintragen.

    Besser wäre es die Funktionalität im Interface der Basisklasse zu hinterlegen, sodaß man die Objekte alle einheitlich behandeln kann.

    Genau dafür ist der ganze Kram ja auch gedacht und nicht um alles ständig wieder auf die konkrete Klasse runterzucasten.


Log in to reply