override
specifier
(since C++11)
仮想関数が別の仮想関数を override することを指定します。
目次 |
構文
識別子
override
は、使用される場合、クラス定義内のメンバ関数宣言またはメンバ関数定義の構文において、
declarator
の直後に現れます。
| declarator virt-specifier-seq (optional) pure-specifier (optional) | (1) | ||||||||
| declarator virt-specifier-seq (optional) function-body | (2) | ||||||||
override
は、宣言子の直後、
virt-specifier-seq
内に記述でき、使用される場合には
pure-specifier
の前に記述することができます。
override
は宣言子の直後、
function-body
の直前の
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(); }; // 構造体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)
|
メソッドがオーバーライドできないこと、またはクラスが派生できないことを宣言する |