static_cast: Compiler gibt keinen Fehler rauas, obwohl er es doch müsste, oder?



  • Hallo ihr Lieben,
    ich fasse mich kurz: Ich habe hier eine Basisklasse sowie eine abgeleitete Klasse. Mit static_cast caste ich nun von der basisklasse in die abgeleitete klasse. So weit, so gut. Nun möchte ich dem gecasteten Objekt einen Wert für ein element der abgeleiteten klasse zuweisen. Bereits hier müsste sich doch schon der Compiler beschweren, oder nicht? So weit ich weiß, wird beim Casten in die abgeleitete Klasse kein Element zusätzlich angelegt.

    Der Compiler beschwert sich aber zunächst nicht.

    Aber als ich dann dieses zugewiesene Element auf der Konsole ausgeben lassen möchte, beschwert er sich plötzlich.

    Kann mir das jemand erklären?

    Vielen Dank für jede Hilfe...

    
    class Base {
    public:
        int baseValue;
    };
    
    class Derived : public Base {
    public:
        int derivedValue;
    };
    
    int main() {
        Base baseObj;
        baseObj.baseValue = 10;
    
        Derived* derivedPtr = static_cast<Derived*>(&baseObj);
        derivedPtr->derivedValue = 20; // Das gibt seltsamer Weise keine Fehlermeldung
    
        std::cout << "baseValue: " << baseObj.baseValue << std::endl;
        std::cout << "derivedValue: " << derivedPtr->derivedValue << std::endl; // Hier gibt es die Fehlermeldung
    
        return 0;
    }


  • Es wird statisch ein Zeiger in einen anderen Zeiger konvertiert. Bei einem static_cast wird nicht geprüft, ob die Klassenhierarchie das überhaupt erlaubt. Dazu müsstest Du dann dynamic_cast verwenden, was wiederum nur mit polymorphen Klassen funktionieren kann. Tut man das wirft der Compiler auch eine Warnung.

    #include <iostream>
    #include <cstdlib>
    
    class Base {
    public:
        int baseValue;
    
        virtual ~Base() = default;
    };
    
    class Derived : public virtual Base {
    public:
        int derivedValue;
    };
    
    int main() {
        Base baseObj;
        baseObj.baseValue = 10;
    
        Derived* derivedPtr = dynamic_cast<Derived*>(&baseObj);
    
        if (!derivedPtr) return EXIT_FAILURE;
    
        derivedPtr->derivedValue = 20; // Das gibt seltsamer Weise keine Fehlermeldung
    
        std::cout << "baseValue: " << baseObj.baseValue << std::endl;
        std::cout << "derivedValue: " << derivedPtr->derivedValue << std::endl; // Hier gibt es die Fehlermeldung
    
        return EXIT_SUCCESS;
    }
    
    static_cast.cc: In function ‘int main()’:
    static_cast.cc:20:27: warning: ‘dynamic_cast<class Derived*>(Base baseObj)’ can never succeed
       20 |     Derived* derivedPtr = dynamic_cast<Derived*>(&baseObj);
          |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    


  • Ah, okay, vielen Dank Dir!!! Das hilft mir auf jeden Fall schonmal!


Anmelden zum Antworten