Пространства имён
Варианты
Действия

Спецификатор override (начиная с C++11)

Материал из cppreference.com
< cpp‎ | language
 
 
 
 

Указывает, что виртуальная функция переопределяет другую виртуальную функцию.

Содержание

[править] Синтаксис

Идентификатор override, если он используется, появляется сразу после декларатора в синтаксисе объявления функции-элемента или определения функции-элемента внутри определения класса.

декларатор последовательность-спецификаторов-виртуальности (необязательно) чистый-спецификатор (необязательно) (1)
декларатор последовательность-спецификаторов-виртуальности (необязательно) тело-функции (2)
1) В объявлении функции-элемента override может появиться в последовательности-спецификаторов-виртуальности сразу после декларатора и перед чистым-спецификатором, если используется.
2) В определении функции-элемента внутри определения класса override может появиться в последовательности-спецификаторов-виртуальности сразу после декларатора и непосредственно перед телом-функции.

В обоих случаях последовательность-спецификаторов-виртуальности, если она используется, равна либо override, либо final, либо final override, либо override final.

[править] Объяснение

В объявлении или определении функции-элемента спецификатор override гарантирует, что функция является виртуальной и переопределяет виртуальную функцию из базового класса. Программа некорректна (генерируется ошибка времени компиляции), если это не так.

override это идентификатор со специальным значением, когда он используется после деклараторов функций-элементов: в противном случае это не зарезервированное ключевое слово.

[править] Пример

#include <iostream>
 
struct A
{
    virtual void foo();
    void bar();
    virtual ~A();
};
 
// определения функций-элементов структуры A:
void A::foo() { std::cout << "A::foo();\n"; }
A::~A() { std::cout << "A::~A();\n"; }
 
struct B : A
{
//  void foo() const override; // Ошибка: B::foo не переопределяет A::foo
                               // (несоответствие сигнатур)
    void foo() override; // OK: B::foo переопределяет A::foo
//  void bar() override; // Ошибка: A::bar не является виртуальным
    ~B() override; // OK: `override` также может применяться к виртуальным
                   // специальным функциям-элементам, например деструкторам
    void override(); // OK, имя функции-элемента, а не зарезервированное ключевое слово
};
 
// определения функций-элементов структуры 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, вызывает функцию-элемент `override()`
    int override{42}; // OK, определяет целочисленную переменную
    std::cout << "override: " << override << '\n';
}

Вывод:

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

[править] Смотрите также

спецификатор final(C++11) объявляет, что метод не может быть переопределён [править]