dynamic_cast == static_cast + Überprüfung?



  • Ist dynamic_cast eigentlich das Gleiche wie static_cast nur das zusätzlich eine Überprüfung stattfindet? Oder kann dynamic_cast etwas was static_cast nicht kann?



  • bezeichner schrieb:

    Ist dynamic_cast eigentlich das Gleiche wie static_cast nur das zusätzlich eine Überprüfung stattfindet? Oder kann dynamic_cast etwas was static_cast nicht kann?

    dynamic_cast ist nur gebräuchlich für Umwandlungen zwischen Basis- und abgeleiteten Klassen; static_cast wird für Umwandlungen zwischen "verwandten" Datentypen, wie zwischen int und double, benutzt. Der C++-Standard erlaubt eigentlich das Konvertieren von Zeigern in Zeiger auf Basis- oder abgeleitete Klassen mittels static_cast nicht.



  • Der C++-Standard erlaubt eigentlich das Konvertieren von Zeigern in Zeiger auf Basis- oder abgeleitete Klassen mittels static_cast nicht.

    Wo steht das. 😕



  • audacia schrieb:

    bezeichner schrieb:

    Ist dynamic_cast eigentlich das Gleiche wie static_cast nur das zusätzlich eine Überprüfung stattfindet? Oder kann dynamic_cast etwas was static_cast nicht kann?

    dynamic_cast ist nur gebräuchlich für Umwandlungen zwischen Basis- und abgeleiteten Klassen; static_cast wird für Umwandlungen zwischen "verwandten" Datentypen, wie zwischen int und double, benutzt. Der C++-Standard erlaubt eigentlich das Konvertieren von Zeigern in Zeiger auf Basis- oder abgeleitete Klassen mittels static_cast nicht.

    Sicher?

    Der folgende Code veranschaulicht noch eine Fähigkeit von dynamic_cast, die static_cast nicht hat.

    class Base1 {
    public:
       virtual ~Base1();
    };
    
    class Base2 {
    public:
       virtual ~Base2();
    };
    
    class Derived : public Base1, public Base2 {
    
    };
    
    int main()
    {
       Base1 * a = new Derived;
       Derived * b = static_cast<Derived *>(a); //ok
       Base2 * c = b;  //ok
       Base2 * d = dynamic_cast<Base2*>(a); //ok
       Base2 * e = a;  //nicht ok
       Base2 * f = static_cast<Base2*>(a); //nicht ok
    }
    


  • Ponto schrieb:

    Sicher?

    Hmm, du hast recht... 😞
    Wundert mich, daß das geht mit der Konversion von Base1* auf Base2*, aber mit dem Pointer kannst du (normalerweise, es sei denn, die beiden hätten wiederum eine gemeinsame Basisklasse) nichts vernünftiges anfangen, da die Klassen nichts gemeinsam haben, oder irre ich mich da wieder?

    Moritz



  • audacia schrieb:

    Ponto schrieb:

    Sicher?

    Hmm, du hast recht... 😞
    Wundert mich, daß das geht mit der Konversion von Base1* auf Base2*, aber mit dem Pointer kannst du (normalerweise, es sei denn, die beiden hätten wiederum eine gemeinsame Basisklasse) nichts vernünftiges anfangen, da die Klassen nichts gemeinsam haben, oder irre ich mich da wieder?

    Moritz

    Mann kann schon was damit anfangen, da dieser Cast nur dann erfolgreich ist, wenn das Objekt hinter dem Base1* auch tatsächlich einen Base2* hat.



  • ach ich hab nur kacke gelabert 😃


Anmelden zum Antworten