override
specifier
(since C++11)
Указывает, что виртуальная функция переопределяет другую виртуальную функцию.
Содержание |
Синтаксис
Идентификатор
override
, если используется, появляется непосредственно после
декларатора
в синтаксисе объявления функции-члена или определения функции-члена внутри определения класса.
| declarator virt-specifier-seq (optional) pure-specifier (optional) | (1) | ||||||||
| declarator virt-specifier-seq (optional) function-body | (2) | ||||||||
`, `
`, `
override
может появляться в
virt-specifier-seq
сразу после декларатора и перед
pure-specifier
, если он используется.
override
может появляться в
virt-specifier-seq
непосредственно после декларатора и непосредственно перед
function-body
.
В обоих случаях,
virt-specifier-seq
, если используется, может быть либо
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)
|
объявляет, что метод не может быть переопределен или класс не может быть унаследован |