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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.