Für Klassen, Strukturen und Funktionen wurde die Unterstützung der Modifier final und override hinzugefügt.
Modifier final für Klassen und Strukturen
Das
Vorhandensein des final Modifiers bei der Deklaration der Struktur
verbietet eine weitere Vererbung. Wenn es nicht notwendig ist, die
Klasse (Struktur) weiter zu modifizieren oder wenn keine Änderungen aus
Sicherheitsgründen zulässig sind, deklarieren Sie diese mit dem final
Modifier. Dabei werden alle Glieder der Struktur implizit auch als final
gelten.
class CFoo final
{
};
class CBar : public CFoo
{
};
Bei einem Versuch der Vererbung von einer Struktur mit dem
final Modifier, wie im Beispiel oben, gibt der Compiler einen Fehler
aus:cannot inherit from 'CFoo' as it has been declared as 'final'
see declaration of 'CFoo'
Modifier override für Funktionen
Der
override Modifier bedeutet, dass die zu deklarierende Funktion die
Methode der Basisklasse unbedingt überschreiben muss. Dank diesem
Modifier kann man Fehler beim Überschreiben vermeiden, wie z.B.
zufällige Änderung der Methodensignatur. In der Basisklasse ist zum
Beispiel die Methode func definiert, die die Variable vom Typ int als
Argument hat:
class CFoo
{
void virtual func(int x) const { }
};
Weiter wird die Methode in der abgeleiteten Klasse neu definiert:
class CBar : public CFoo
{
void func(short x) { }
};
Aber durch einen Fehler ändert sich der Typ des Arguments von
int zu short. In diesem Fall wird die Methode nicht mehr überschrieben,
sondern überladen. In einigen Situationen kann der Compiler entsprechend
dem Algorithmus der überladenen Funktion eine in der Basisklasse definierte Methode statt einer überschriebenen auswählen.
Um solche Fehler zu vermeiden, sollte man der Methode den override Modifier hinzufügen.
class CBar : public CFoo
{
void func(short x) override { }
};
Wenn die Signatur beim Überschreiben geändert wird, kann der Compiler
keine Methode mit der gleichen Signatur in der Basisklasse finden und
gibt einen Kompilierungsfehler aus:'CBar::func' method is declared with 'override' specifier but does not override any base class method
Modifier final für Funktionen
Der
Modifier final funktioniert umgekehrt: er verbietet, Methoden in
abgeleiteten Klassen zu überschreiben. Wenn die Implementierung der
Methode abgeschlossen ist, deklarieren Sie diese mit dem final Modifier,
damit sie später garantiert nicht verändert wird.
class CFoo
{
void virtual func(int x) final { }
};
class CBar : public CFoo
{
void func(int) { }
};
Bei einem Versuch der Vererbung von einer Struktur mit dem final
Modifier, wie im Beispiel oben, gibt der Compiler einen Fehler aus:'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
see declaration of 'CFoo::func'