Namensräume
Varianten
Aktionen

override-Spezifizierer (seit C++11)

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
Virtuelle Funktion
override-Spezifizierer (C++11)  
final-Spezifizierer (C++11)
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Gibt an, dass eine virtuelle Funktion eine andere virtuelle Funktion überschreibt.

Inhalt

[bearbeiten] Syntax

Der Bezeichner override erscheint, falls verwendet, unmittelbar nach dem Deklarator in der Syntax einer Member-Funktionsdeklaration oder einer Member-Funktionsdefinition innerhalb einer Klassendefinition.

Deklarator virt-specifier-seq (optional) pure-specifier (optional) (1)
Deklarator virt-specifier-seq (optional) function-body (2)
1) In einer Member-Funktionsdeklaration kann override in virt-specifier-seq unmittelbar nach dem Deklarator und vor dem pure-specifier, falls verwendet, erscheinen.
2) In einer Member-Funktionsdefinition innerhalb einer Klassendefinition kann override 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.

[bearbeiten] Erklärung

In einer Member-Funktionsdeklaration oder -definition stellt der override-Spezifizierer sicher, dass die Funktion virtuell ist und eine virtuelle Funktion einer Basisklasse überschreibt. Das Programm ist ill-formed (ein Kompilierungsfehler wird generiert), wenn dies nicht der Fall ist.

override ist ein Bezeichner mit besonderer Bedeutung, wenn er nach Member-Funktionsdeklaratoren verwendet wird; andernfalls ist es kein reserviertes Schlüsselwort.

[bearbeiten] Schlüsselwörter

override

[bearbeiten] Beispiel

#include <iostream>
 
struct A
{
    virtual void foo();
    void bar();
    virtual ~A();
};
 
// member functions definitions of struct A:
void A::foo() { std::cout << "A::foo();\n"; }
A::~A() { std::cout << "A::~A();\n"; }
 
struct B : A
{
//  void foo() const override; // Error: B::foo does not override A::foo
                               // (signature mismatch)
    void foo() override; // OK: B::foo overrides A::foo
//  void bar() override; // Error: A::bar is not virtual
    ~B() override; // OK: `override` can also be applied to virtual
                   // special member functions, e.g. destructors
    void override(); // OK, member function name, not a reserved keyword
};
 
// member functions definitions of 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, invokes the member function `override()`
    int override{42}; // OK, defines an integer variable
    std::cout << "override: " << override << '\n';
}

Ausgabe

B::foo();
B::override();
override: 42
B::~B();
A::~A();

[bearbeiten] Siehe auch

final-Spezifizierer (C++11) deklariert, dass eine Methode nicht überschrieben werden kann oder eine Klasse nicht von ihr abgeleitet werden kann[bearbeiten]