Forum: PC-Programmierung c++: virtuelle const Base-Funktion non-const überschreiben


von MeterPaffei (Gast)


Lesenswert?

Hallo Leute,
ich stehe vor einem kleien Problem:

Ich habe einen
1
 virtual void fct(void) const;
gegeben und möchte in der abgeleiteten Klasse, D, in der fct() Members 
(nur von D) ändern..

also quasi mit
1
 virtual void fct(void);
überschreiben (zumindest was die neu eingeführent Members angeht).

Geht das irgendwie?

Danke schon mal!

MfG
Meter

von Rolf M. (rmagnus)


Lesenswert?

MeterPaffei schrieb:
> Geht das irgendwie?

Nein, die Signatur muss die gleiche sein, und das const gehört zur 
Signatur.
Wäre auch nicht sinnvoll, denn das Interface (über die Basisklasse) 
sagt, dass das Objekt nicht verändert wird. Wenn man also die Funktion 
mit einem Pointer auf const aufruft, soll nicht heimlich dieses const 
entfernt werden.

von Zombie (Gast)


Lesenswert?

MeterPaffei schrieb:
> Geht das irgendwie?

Zwei mögliche Workarounds:
1. die Membervariable als mutable definieren.
2. ein const_cast auf this.
1
virtual void fct(void) const override {
2
D* self = const_cast<D*>(this);
3
//...
4
}

von Rolf M. (rmagnus)


Lesenswert?

Zombie schrieb:
> 1. die Membervariable als mutable definieren.



> 2. ein const_cast auf this.

Allerdings ist das ein ziemlicher Hack.

Die wichtige Frage wäre erst mal, warum er glaubt, das zu brauchen.

von Meter Paffei (Gast)


Lesenswert?

Danke nochmal.
Ist in diesem Fall nicht schlimm, das const zu "umgehen".
Den const_cast hatte ich ganz vergessen.

von M.K. B. (mkbit)


Lesenswert?

Meter Paffei schrieb:
> Danke nochmal.
> Ist in diesem Fall nicht schlimm, das const zu "umgehen".
> Den const_cast hatte ich ganz vergessen.

Mag sein, ist aber meist eine Fehler in der Architektur.
Wenn es sich nicht um eine Synchronisierung (z.B. Mutex) oder ein 
Logging zur Fehlersuche handelt, könnte das bei der Fehlersuche 
verwirren. An der Methode steht const dran, es ändert sich aber.

Und in C++ braucht man das void bei Funktionen ohne Parameter nicht.

von Rolf M. (rmagnus)


Lesenswert?

Der const-cast ist auch nur dann erlaubt, wenn das Objekt nicht 
ursprünglich als const erzeugt wurde.

von Wilhelm M. (wimalopaan)


Lesenswert?

Warum willst Du das überschreiben wollen?

Füge doch einfach die non-const Variante hinzu. Das geht ja, denn das 
const gehört ja zur Signatur, deswegen kann man ja non-const mit const 
überladen.

von Wilhelm M. (wimalopaan)


Lesenswert?

M.K. B. schrieb:
> An der Methode steht const dran, es ändert sich aber.

Deswegen spricht man ja auch von "beobachtbarem Zustand": 
Beobachterfunktionen (const) ändern den beobachtbaren Zustand nicht. 
Daher zählen die mutable Elemente zum nicht-beobachtbaren Zustand.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.