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

Especifica que una función virtual sobrescribe otra función virtual.

Contenidos

Sintaxis

El identificador override , si se utiliza, aparece inmediatamente después del declarador en la sintaxis de una declaración de función miembro o una definición de función miembro dentro de una definición de clase.

declarador secuencia-de-especificadores-virtuales  (opcional) especificador-puro  (opcional) (1)
declarador secuencia-de-especificadores-virtuales  (opcional) cuerpo-de-función (2)
1) En una declaración de función miembro, override puede aparecer en virt-specifier-seq inmediatamente después del declarador, y antes del pure-specifier , si se utiliza.
2) En una definición de función miembro dentro de una definición de clase, override puede aparecer en virt-specifier-seq inmediatamente después del declarador y justo antes de function-body .

En ambos casos, virt-specifier-seq , si se utiliza, es ya sea override o final , o final override o override final .

Explicación

En una declaración o definición de función miembro, override asegura que la función es virtual y está sobrescribiendo una función virtual de una clase base. El programa está mal formado (se genera un error en tiempo de compilación) si esto no es cierto.

override es un identificador con un significado especial cuando se utiliza después de declaradores de funciones miembro; no es una palabra clave reservada en otros casos.

Palabras clave

override

Ejemplo

#include <iostream>
struct A
{
    virtual void foo();
    void bar();
    virtual ~A();
};
// definiciones de funciones miembro de la estructura 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 no sobreescribe A::foo
                               // (incompatibilidad de firma)
    void foo() override; // OK: B::foo sobreescribe A::foo
//  void bar() override; // Error: A::bar no es virtual
    ~B() override; // OK: `override` también puede aplicarse a funciones
                   // miembro especiales virtuales, ej. destructores
    void override(); // OK, nombre de función miembro, no palabra clave reservada
};
// definiciones de funciones miembro de la estructura 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, invoca la función miembro `override()`
    int override{42}; // OK, define una variable entera
    std::cout << "override: " << override << '\n';
}

Salida:

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

Véase también

final especificador (C++11) declara que un método no puede ser sobrescrito o que una clase no puede ser derivada