const und Vererbung



  • Hallo,

    ich habe eine Frage zu const und Vererbung:

    class Test1
    {
    public:
    virtual void setVariable() const=0;
    }
    
    class Test2 : public Test1
    {
    public:
    bool bVar;
    virtual void setVariable() const;
    }
    
    void Test2::setVariable() const
    {
    
     bVar=false; //geht nicht Fehler: L-Wert gibt ein konstantes Objekt an
    
     ((Test2*) this)->bVar=false; //geht
    
    }
    

    Das nachfolgende const bedeutet ja, dass this nicht verändert werden darf, aber
    wieso geht dann ((Test2*) this)->bVar=false; das 😕

    so long
    Don



  • Naja, du castest die "const"-heit ja einfach weg.
    Die C++-Mechanismen schützen vor kleinen Fahrlässigkeiten, aber nicht vor vorsätzlichem Missbrauch.
    😉



  • weil du mit dem C-style cast this nach Test2* castest und damit das const verwirfst. Sprich: eigentlich ist this innerhalb der Funktion vom Typ const Test2*. Der cast bringt in dem Fall das selbe wie const_cast<Test2*>(this)

    zu gut deutsch: sieht bescheiden aus, ist auch nicht besonders schoen 😉

    Wenn die zu veraendernde Variable nicht zum internen Zustand des Objekt gehoert (sprich, wenn sie auch in const-Funktionen gefahrlos geaendert werden darf), dann deklariere sie als mutable, damit du die casts weglassen kannst. Sollte sie allgemeins schon const bleiben und nur in diesem speziellen Fall doch veraendert werden (was die const-heit des Objektes eigentlich verletzt), dann benutz lieber den C++ const_cast.



  • Don999 schrieb:

    Das nachfolgende const bedeutet ja, dass this nicht verändert werden darf, aber
    wieso geht dann ((Test2*) this)->bVar=false; das 😕

    Weil Du hier this das const weg-castest (Test2* ist nicht const, steht ja auch nicht dabei 😉 )



  • Btw - der Methodenname "setVariable()" deutet eigentlich darauf hin, daß diese Methode irgendwas in der Klasse setzen will - da hast du entweder einen unpassenden Namen gewählt (für eine Ausgabe-Methode ist "getVariable()" passender) oder das const ist überflüssig.



  • Danke für die Antworten.
    In C++ kann man ja machen was man will 🕶
    Ich komme von Delphi und da wird man an die Hand genommen.
    Beim Methodennamen hab ich nicht sonderlich viel nachgedacht...

    so long
    Don



  • Don999 schrieb:

    Danke für die Antworten.
    In C++ kann man ja machen was man will 🕶

    Klar kannst du machen, was du willst - aber wenn du irgendwann ein "echt" konstantes Objekt vorgesetzt bekommst, wird dir das Programm mit einem SegFault um die Ohren fliegen.



  • Hi,

    nachdem das eigentliche Problem ja gelöst scheint, noch eine Anregung von mir: Da das Ganze 0% mit Vererbung zu tun hat, sollte man das evtl. auch aus der Titelzeile entfernen ("Viagra" steht da ja auch nicht drin 😉 ).

    EDIT: Oh - als "Unregistrierter" kann man das wahrscheinlich gar nicht.
    Noch ein Grund, Unregs das Erstellen neuer Threads zu verbieten. 😉

    Gruß,

    Simon2.



  • pumuckl schrieb:

    eigentlich ist this innerhalb der Funktion vom Typ const Test2*.

    Nur ne Detailfrage: ist this innerhalb der Methode nicht vom Typ const Test* const?



  • this->that schrieb:

    pumuckl schrieb:

    eigentlich ist this innerhalb der Funktion vom Typ const Test2*.

    Nur ne Detailfrage: ist this innerhalb der Methode nicht vom Typ const Test* const?

    Da this kein lvalue ist, sprich nicht auf der linken Seite einer Zuweisung stehen kann, verhält es sich in der Tat immer wie T* const (übrigens unabhäöngig davon, ob T selbst const ist).



  • Don999 schrieb:

    Ich komme von Delphi und da wird man an die Hand genommen.

    In C++ wird man auch "an die Hand genommen". Man wird nur nicht kastriert 🙂



  • LordJaxom schrieb:

    this->that schrieb:

    pumuckl schrieb:

    eigentlich ist this innerhalb der Funktion vom Typ const Test2*.

    Nur ne Detailfrage: ist this innerhalb der Methode nicht vom Typ const Test* const?

    Da this kein rvalue ist, sprich nicht auf der rechten Seite einer Zuweisung stehen kann, verhält es sich in der Tat immer wie T* const (übrigens unabhäöngig davon, ob T selbst const ist).

    Meinst du nicht eher lvalue und linke Seite?



  • this->that schrieb:

    Meinst du nicht eher lvalue und linke Seite?

    Äh, ja.


Anmelden zum Antworten