override
specifier
(since C++11)
Gibt an, dass eine virtuelle Funktion eine andere virtuelle Funktion überschreibt.
Inhaltsverzeichnis |
Syntax
Der Bezeichner
override
, falls verwendet, erscheint unmittelbar nach dem
Deklarator
in der Syntax einer Memberfunktionsdeklaration oder einer Memberfunktionsdefinition innerhalb einer Klassendefinition.
| Deklarator virt-specifier-seq (optional) pure-specifier (optional) | (1) | ||||||||
| Deklarator virt-specifier-seq (optional) Funktionskörper | (2) | ||||||||
override
in der
virt-specifier-seq
unmittelbar nach dem Deklarator und vor dem
pure-specifier
erscheinen, falls verwendet.
override
kann in
virt-specifier-seq
unmittelbar nach dem Deklarator und direkt vor
function-body
erscheinen.
In beiden Fällen ist
virt-specifier-seq
, falls verwendet, entweder
override
oder
final
, oder
final override
oder
override final
.
Erklärung
In einer Memberfunktionsdeklaration oder -definition stellt der override -Spezifizierer sicher, dass die Funktion virtuell ist und eine virtuelle Funktion von einer Basisklasse überschreibt. Das Programm ist fehlerhaft (es wird ein Kompilierzeitfehler generiert), falls dies nicht zutrifft.
override
ist ein
Bezeichner mit spezieller Bedeutung
, wenn er nach Member-Funktionsdeklaratoren verwendet wird; andernfalls ist es kein reserviertes
Schlüsselwort
.
Schlüsselwörter
Beispiel
#include <iostream> struct A { virtual void foo(); void bar(); virtual ~A(); }; // Definitionen der Elementfunktionen von struct A: void A::foo() { std::cout << "A::foo();\n"; } A::~A() { std::cout << "A::~A();\n"; } struct B : A { // void foo() const override; // Fehler: B::foo überschreibt A::foo nicht // (Signatur stimmt nicht überein) void foo() override; // OK: B::foo überschreibt A::foo // void bar() override; // Fehler: A::bar ist nicht virtual ~B() override; // OK: `override` kann auch auf virtuelle // spezielle Elementfunktionen angewendet werden, z.B. Destruktoren void override(); // OK, Elementfunktionsname, kein reserviertes Schlüsselwort }; // Definitionen der Elementfunktionen von struct B: void B::foo() { std::cout << "B::foo();\n"; } B::~B() { std::cout << "B::~B();\n"; } void B::override() { std::cout << "B::override();\n"; } int main() { B b; b.foo(); b.override(); // OK, ruft die Elementfunktion `override()` auf int override{42}; // OK, definiert eine Integer-Variable std::cout << "override: " << override << '\n'; }
Ausgabe:
B::foo(); B::override(); override: 42 B::~B(); A::~A();
Siehe auch
final
Spezifizierer
(C++11)
|
deklariert, dass eine Methode nicht überschrieben oder eine Klasse nicht abgeleitet werden kann |