dynamic_cast bei verschiedenen typedefs



  • camper schrieb:

    Sofern DerivedTest polymorph ist, ist das legal.

    Kannst du das bitte mal kurz erklären?


  • Mod

    Shade Of Mine schrieb:

    camper schrieb:

    Sofern DerivedTest polymorph ist, ist das legal.

    Kannst du das bitte mal kurz erklären?

    Crosscast.



  • camper schrieb:

    Shade Of Mine schrieb:

    camper schrieb:

    Sofern DerivedTest polymorph ist, ist das legal.

    Kannst du das bitte mal kurz erklären?

    Crosscast.

    Ah, OK.
    dafür ists aber immer 0, oder?
    Gibt es eine Situation wo nicht 0 heraus kommen kann?



  • Danke erstmal für die Antworten.

    @camper: okay, hmm, ich dachte da die Template Parameter selber gecasted werden könnten, dass auch das Klassentemplate entsprechend gecasted werden kann. Warum geht das eigentlich nicht?

    Gut dann werde ich eine (template-lose) Basisklasse erzeugen von der TestClass erbt und entsprechend anstatt zu BaseTest dann einfach zur Basisklasse casten. Obwohl das natürlich nich gerade elegant ist. Gibt es denn einen besseren Weg (bis auf entpsrechende templates natürlich...klar)?

    Vielen Dank jedenfalls und ich bin interessiert an weiterführenden Links zu diesem Thema.



  • Shade Of Mine schrieb:

    DerivedTest und BaseTest sind nicht miteinander verwandt.

    Ja, die hier auftretenden dynamischen Typen stehen in keiner Vererbungsbeziehung. Ein DerivedTest ist kein BaseTest und ein BaseTest ist kein DerivedTest. Ich verstehe camper jetzt so, dass er sich auf das "sollte schreien" bezog. Ich dachte zunächst, er würde irgendwo eine Veerbungsbeziehung sehen, wo keine ist.



  • krümelkacker schrieb:

    Shade Of Mine schrieb:

    DerivedTest und BaseTest sind nicht miteinander verwandt.

    Ja, die hier auftretenden dynamischen Typen stehen in keiner Vererbungsbeziehung. Ein DerivedTest ist kein BaseTest und ein BaseTest ist kein DerivedTest. Ich verstehe camper jetzt so, dass er sich auf das "sollte schreien" bezog. Ich dachte zunächst, er würde irgendwo eine Veerbungsbeziehung sehen, wo keine ist.

    Eine Folgefrage. Theoretisch könnte ich ja auch für alle ein BaseTest objekt erzeugen und denoch die abgeleiteten Typen darin speichern oder?

    Also quasi ca so:

    BaseTest* abgeleitet = new BaseTest();
    
    for(x..){
    DerivedValue* val = server->GetDerivedValue(x);
    abgeleitet.addEntry(val);
    }
    
    //wobei TestClass::addEntry(const T_VALUE* t_val) {...}
    

    Spricht da was gegen?



  • Katachi schrieb:

    Eine Folgefrage. Theoretisch könnte ich ja auch für alle ein BaseTest objekt erzeugen und denoch die abgeleiteten Typen darin speichern oder?

    Ja.

    Deinen Code verstehe ich zwar nicht, aber uU suchst du das Stichwort: type erasure.



  • Shade Of Mine schrieb:

    Ah, OK.
    dafür ists aber immer 0, oder?
    Gibt es eine Situation wo nicht 0 heraus kommen kann?

    Naja, wenn er einen Pointer castet, kommt nullptr raus, wenn er eine Referenz castet, fliegt ein std::bad_cast 😉



  • Shade Of Mine schrieb:

    Katachi schrieb:

    Eine Folgefrage. Theoretisch könnte ich ja auch für alle ein BaseTest objekt erzeugen und denoch die abgeleiteten Typen darin speichern oder?

    Ja.

    Deinen Code verstehe ich zwar nicht, aber uU suchst du das Stichwort: type erasure.

    Vielen Dank für den Hinweis auf type erasure!





  • Shade Of Mine schrieb:

    camper schrieb:

    Shade Of Mine schrieb:

    camper schrieb:

    Sofern DerivedTest polymorph ist, ist das legal.

    Kannst du das bitte mal kurz erklären?

    Crosscast.

    Ah, OK.
    dafür ists aber immer 0, oder?
    Gibt es eine Situation wo nicht 0 heraus kommen kann?

    Klar.

    struct Foo : BaseTest, DerivedTest {};
    

    Crosscast eben, wie camper schon sagte.
    dynamic_cast kann das ja, wenn der Crosscast eindeutig ist (die gesuchte Klasse in der Hierarchie genau 1x vorkommt).
    Ohne Foo zu kennen kann man auch nicht wissen dass bzw. ob der Cast jemals "funktionieren" kann. Genau deswegen kann man ihn auch immer schreiben, da ja jede Translation-Unit nur einen Teil der Klassen im gesamten Programm sieht.



  • krümelkacker schrieb:

    Katachi, Was willst du eigentlich erreichen?

    Ich will einfach erstmal wissen was möglich ist, was es für Konzepte gibt, welches der beste Weg ist, welcher Weg welche Vor-/Nachteile bietet...sprich ausprobieren und lernen! Nicht mehr aber auch nicht weniger. 🙂 Ich bin in der Konzeptphase meines Projekts, deswegen.



  • Katachi schrieb:

    [...] welches der beste Weg ist [...]

    Wenn dynamic_cast vorkommt, ist es in der Regel alles andere als der beste Weg 😉


Anmelden zum Antworten