override 指定子 (C++11 以降)
From cppreference.com
仮想関数が別の仮想関数をオーバーライドすることを指定します。
目次 |
[編集] 構文
識別子overrideは、使用される場合、メンバ関数の宣言またはクラス定義内のメンバ関数の定義の構文において、宣言子の直後に置かれます。
| 宣言子 virt-specifier-seq (省略可能) 純粋指定子 (省略可能) | (1) | ||||||||
| 宣言子 virt-specifier-seq (省略可能) 関数本体 | (2) | ||||||||
2) クラス定義内のメンバ関数の定義では、
overrideはvirt-specifier-seqに、宣言子の直後、関数本体の直前に置くことができます。どちらの場合も、virt-specifier-seqは、使用される場合、overrideまたはfinal、またはfinal overrideまたはoverride finalのいずれかです。
[編集] 解説
メンバ関数の宣言または定義において、override指定子は、その関数が仮想関数であり、基底クラスの仮想関数をオーバーライドしていることを保証します。これが真でない場合、プログラムは不適格です(コンパイル時エラーが生成されます)。
overrideは、メンバ関数の宣言子の後に使用された場合、特別な意味を持つ識別子です。それ以外では予約キーワードではありません。
[編集] キーワード
[編集] 例
このコードを実行
#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'; }
出力
B::foo(); B::override(); override: 42 B::~B(); A::~A();
[編集] 関連項目
final指定子 (C++11) |
メソッドがオーバーライドできないこと、またはクラスが派生できないことを宣言します |