名前空間
変種
操作

final 指定子 (C++11以上)

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
仮想関数
override 指定子 (C++11)
final 指定子 (C++11)
特別なメンバ関数
テンプレート
その他
 
 

仮想関数が派生クラスでオーバーライドできないこと、またはクラスが継承できないことを指定します。

目次

[編集] 構文

メンバ関数に適用されるとき、識別子 final はメンバ関数の宣言またはクラス定義の内部のメンバ関数の定義の構文の宣言子の直後に現れます。

クラスに適用されるとき、識別子 final はクラス定義の先頭、クラスの名前の直後に現れます。

declarator virt-specifier-seq(オプション) pure-specifier(オプション) (1)
declarator virt-specifier-seq(オプション) function-body (2)
class-key attr(オプション) class-head-name class-virt-specifier(オプション) base-clause(オプション) (3)
1) メンバ関数の宣言では、 final は、使用される場合は、宣言子の直後、純粋指定子の前の virt-specifier-seq に現れることができます。
2) クラス定義の内部のメンバ関数の定義では、 final は、宣言子の直後、 function-body の前の virt-specifier-seq に現れることができます。
3) クラス定義では、 final は、使用される場合は、クラスの名前の直後、 base-clause の始まりのコロンの直前の class-virt-specifier として現れることができます。

(1,2) では、 virt-specifier-seq は、使用される場合は、 override または final または final override または override final のいずれかです。 (3) では、使用される場合は、 class-virt-specifier の唯一許される値は final です。

[編集] 説明

仮想関数の宣言または定義で使用されたとき、 final は、その関数が仮想であることを保証し、派生クラスによってオーバーライドされてはならないことを指定します。 そうでなければ、プログラムは ill-formed です (コンパイル時エラーが生成されます)。

クラス定義で使用されたとき、 final は、そのクラスが別のクラス定義の base-specifier-list 内に現れてはならない (別の言い方をすると、派生できない) ことを指定します。 そうでなければ、プログラムは ill-formed です (コンパイル時エラーが生成されます)。 final共用体の定義でも使用できます。 この場合、効果はありません (共用体は元々派生できないため。 ただし std::is_final の結果には反映されます)。

final はメンバ関数の宣言またはクラスの先頭で使用されたときに特別な意味を持つ識別子です。 それ以外の文脈では予約されておらず、オブジェクトや関数の名前に使用しても構いません。

[編集]

struct Base
{
    virtual void foo();
};
 
struct A : Base
{
    void foo() final; // Base::foo をオーバーライドします。 final オーバーライドです。
    void bar() final; // エラー、非仮想関数は final にできません。
};
 
struct B final : A // 構造体 B は final です。
{
    void foo() override; // エラー、 foo は A で final のためオーバーライドできません。
};
 
struct C : B // エラー、 B は final です。
{
};


[編集] 関連項目