Namespaces
Variants

override specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Virtual function
override specifier (C++11)
final specifier (C++11)
Special member functions
Templates
Miscellaneous

Spécifie qu'une fonction virtuelle remplace une autre fonction virtuelle.

Table des matières

Syntaxe

L'identifiant override , s'il est utilisé, apparaît immédiatement après le déclarateur dans la syntaxe d'une déclaration de fonction membre ou d'une définition de fonction membre à l'intérieur d'une définition de classe.

declarator virt-specifier-seq  (optionnel) pure-specifier  (optionnel) (1)
declarator virt-specifier-seq  (optionnel) function-body (2)
1) Dans une déclaration de fonction membre, override peut apparaître dans virt-specifier-seq immédiatement après le déclarateur, et avant le pure-specifier , s'il est utilisé.
2) Dans une définition de fonction membre à l'intérieur d'une définition de classe, override peut apparaître dans virt-specifier-seq immédiatement après le déclarateur et juste avant function-body .

Dans les deux cas, virt-specifier-seq , si utilisé, est soit override ou final , soit final override ou override final .

Explication

Dans une déclaration ou définition de fonction membre, override garantit que la fonction est virtuelle et qu'elle redéfinit une fonction virtuelle d'une classe de base. Le programme est mal formé (une erreur de compilation est générée) si cette condition n'est pas respectée.

override est un identifiant ayant une signification particulière lorsqu'il est utilisé après les déclarateurs de fonction membre ; ce n'est pas un mot-clé réservé autrement.

Mots-clés

override

Exemple

#include <iostream>
struct A
{
    virtual void foo();
    void bar();
    virtual ~A();
};
// définitions des fonctions membres de la structure A :
void A::foo() { std::cout << "A::foo();\n"; }
A::~A() { std::cout << "A::~A();\n"; }
struct B : A
{
//  void foo() const override; // Erreur : B::foo ne remplace pas A::foo
                               // (incompatibilité de signature)
    void foo() override; // OK : B::foo remplace A::foo
//  void bar() override; // Erreur : A::bar n'est pas virtuelle
    ~B() override; // OK : `override` peut aussi être appliqué aux
                   // fonctions membres spéciales virtuelles, ex. destructeurs
    void override(); // OK, nom de fonction membre, pas un mot-clé réservé
};
// définitions des fonctions membres de la structure 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, appelle la fonction membre `override()`
    int override{42}; // OK, définit une variable entière
    std::cout << "override: " << override << '\n';
}

Sortie :

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

Voir aussi

final spécificateur (C++11) déclare qu'une méthode ne peut pas être redéfinie ou qu'une classe ne peut pas être dérivée