Wann notwendig static_cast verwenden?



  • Hallo,

    mir ist klar wie Klassenhierachien und polymorpie genutzt werden, damit keine down-cast notwendig sind!

    Aber in welchen fällen ist denoch auf ein static_cast /dynamic_cast nicht zu verzichten?



  • Dann wenn du DownCasts oder CrossCasts hast brauchst du dynamic_cast wenn du auf der sicheren Seite sein willst oder static_cast wenn du dir sicher bist.

    dynamic_cast checkt ob der cast gut ist - wenn du garantieren kannst dass der cast gut ist, reicht static_cast.

    Upcast sind implizit - da muss man garnicht casten.



  • bei einer guter polymorphy ist solche downcast ja nich notwendig... aber bei was für einem design kommt man nich drum rum? Oder ist es immer irgendiwe möglich auf down-casts zu verzichten?



  • dafür braucht man downcasts zwingend:
    Curiously Recurring Template Pattern



  • ok, wie sieht es performancetechnisch aus? wird bei downcast viel rechenzeit benöigt?



  • static_cast bei normaler vererbung: normal 0 takte. der zeiger wird nur anders interpretiert. Mehrfachvererbung bin ich mir nicht ganz sicher, aber viel wirds nicht sein.

    dynamic_cast: implementationsabhängig, normal aber eher sehr langsam.



  • BorisDieKlinge schrieb:

    ok, wie sieht es performancetechnisch aus? wird bei downcast viel rechenzeit benöigt?

    Ein static_cast kostet keine Rechenzeit - es finden ja keine checks statt. Ein dynamic_cast dagegen muss erstmal checken ob der cast legal ist. Er kostet daher ein paar Lookups - je nachdem wie Tief die Klassenhierachie ist wird er teuerer. Ein Fehlschlagen ist immer worst case.

    Im Prinzip ist das aber komplett uninteressant: wenn man downcasten oder crosscasten muss und man dynamic_cast verwenden muss dann muss man das eben. Meistens liegt es in einem fehlerhaften Design begründet, manchmal geht es nicht anders.

    Performance sollte dann relativ irrelevant sein da man sowieso fast alles menschenmögliche tut um so eine Situation zu vermeiden.

    CrossCasts gehen nur mit dynamic_cast, da die beiden Klassen nicht direkt miteinander verwandt sind. Downcasts gehen auch mit static_cast - sofern man sich sicher ist dass der cast legal ist.



  • wenn ich mir also imemr sicher bin auf welchen objekt typ ich casten musst, ist static_cast nicht unbedingt unschön in der programmierung!?



  • naja, unschoen aussehn tuts immer, aber manchmal muss man halt zu unschoenen Mitteln greifen. C++ ist halt auch keine Bonbon-rosane Plueschwelt 😉



  • naja hatte immer angst , das es performance kostet, wenn ich mit static_cast downcaste.. aber wenn es nichts ausmacht, dann nehm ich das mal in kauf..



  • Aber in welchen fällen ist denoch auf ein static_cast /dynamic_cast nicht zu verzichten?

    class B
    {
    public:
       virtual void foo() = 0;
       void optional() {}
    };
    
    class D : public B
    {
    public:
     void foo() {}
     void onlyforme(){}   
    };
    
    int main()
    {
       B* b = new D;
       b->foo(); //call D::foo();
       b->optional() //call B::optional()
       dynamic_cast<D*>(b)->onlyforme();//call D::onlyforme
       return 0;
    }
    

    hier um onlyforme aufzurufen, muss man es casten, od definiert onlyforme wie foo



  • ok so ähnlich siehts in meinem fall aus., auser das ich static_cast statt dynamic_cast verwende, was auch ok ist, weil es wie im beispile ganz sicher ein B objekt ist...



  • netrobot schrieb:

    Aber in welchen fällen ist denoch auf ein static_cast /dynamic_cast nicht zu verzichten?

    class B
    {
    public:
       virtual void foo() = 0;
       void optional() {}
    };
    
    class D : public B
    {
    public:
     void foo() {}
     void onlyforme(){}   
    };
    
    int main()
    {
       B* b = new D;
       b->foo(); //call D::foo();
       b->optional() //call B::optional()
       dynamic_cast<D*>(b)->onlyforme();//call D::onlyforme
       return 0;
    }
    

    hier um onlyforme aufzurufen, muss man es casten, od definiert onlyforme wie foo

    Wobei hier die Frage ist, wie es dazu kommt, dass man "von D nur einen B-Zeiger in Händen hält". Üblicherweise kommt sowas vor, weil man Polymorphie nutzen möchte (z.B. über eine generalisierte API aufrufen) ... und da zeugt es IMHO schon von schlechtem Design (oder einem sehr, sehr scharfen Messer am Hals 😉 ) , wenn man dann doch plötzlich auf "nicht-generelle Eigenschaften" zugreifen möchte/muss.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    ...oder einem sehr, sehr scharfen Messer am Hals 😉 ...

    Hört sich nach typischen Abläufen bei Softwareprojekten an 😉

    cu André



  • asc schrieb:

    Simon2 schrieb:

    ...oder einem sehr, sehr scharfen Messer am Hals 😉 ...

    Hört sich nach typischen Abläufen bei Softwareprojekten an 😉

    cu André

    Ich muss gestehen, dass ich das frei nach Scott Meyers zitiert habe (Kapitel weiß ich nicht mehr) - hat mich sehr beeindruckt ! 😃

    Gruß,

    Simon2.


Anmelden zum Antworten