dynamic_cast Problem



  • Hallo,

    habe folgendes Problem was in Java wie folgt aussehen würde:

    if(x instanceof(ClassX)) {
    ....
    }

    Ich habe gelesen das es in C/C++ mit dynamic_cast realisiert wird. Funktioniert aber nicht, weil meine Superklasse kein polymorpher Typ ist. Was kann ich stattdessen verwenden?

    Danke!
    mfg,
    shed



  • schauen, ob du die adresse deines objekts in einen zeiger auf die superklasse casten kannst.
    damit du das dann in einem if verwenden kannst, könnte vielleicht ein wenig tmplate-alcemie mit sfinea angebracht sein.

    such mal in http://www.mitp.de/imperia/md/content/vmi/29842/1.pdf nach IsDerived



  • @volkard:

    In boost gibt es eine fertige Implementierung "is_base_and_derived" - was denke ich genau das tut was du beschreibst. Wird aber hier denke ich nicht viel bringen, da ich schätze dass "x" wohl ein Basisklassenzeiger sein wird.

    @shed:

    Dynamisches "instance of" gibts in C++ nicht. dynamic_cast funktioniert für die meisten Fälle, aber wie du schon bemerkt hast nur wenn der Typ des Pointers (der Referenz) von dem du ausgehst "polymorph" ist, also min. eine virtuelle Funktion hat. Wenn du dieses "instance of" wirklich brauchst wäre wohl die einfachste Möglichkeit der Basisklasse eine virtuelle Funktion zu schenken.

    Ich denke aber eher dass du irgendwo in deinem Design einen Knopf hast, sonst solltest du eigentlich garnicht den Fall haben "instance of" von einem Typ weg machen zu müssen der nicht polymorph ist. Ich meine um *irgendwas* sinnvoll mit einem Basisklassen-Zeiger anstellen zu können *muss* das Ding fast virtuelle Funktionen haben.

    Das einzige mal wo ich jemals vor der selben Frage stand war wo ich ne Funktion machen wollte, die Exceptions auswerten sollte. Der Funktion wollte ich natürlich nen "std::exception const&" mitgeben, und war dann etwas enttäuscht dass das Dumme Ding (tm) nicht polymorph ist, ich also den eigentlichen Typ nichtmehr ermitteln kann. Habe da auch keine Lösung gefunden, da AFAIK keine existiert.



  • Die Basisklasse sollte immer mindestens eine virtuelle funktion haben, den Destructor.
    Ansonsten ist ableiten eh gefaehrlich, wenn man dann doch den basiszeiger der Klasse ohne die vtable verwendet, und darauf mal nen delete verwendet.

    Entweder man versteckt also den Fact das man von ner nichtvirtuellen klasse abgeleitet hat (in dem man Zeiger auf die basisklasse nicht zulaesst) oder man leitet ned ab. Alles andere ist eh schmu .... von daher ist der dynamic_cast eh ausreichend.

    Ciao ...


Anmelden zum Antworten