C++11 の final と override

Ut Video Codec Suite のソースを大幅にいじりつつ、Java でいう final (C# では sealed)や C# でいう override が無いせいで無駄にハマってるなぁ、と感じていたのですが、C++11 には final と override が追加されてたんですね。

class A
{
public:
    virtual void foo() final;

    virtual void bar();
    void baz();
    virtual void hoge();

    virtual void fuga();
};

class B final : public A
{
public:
    void foo();           // NG: final 仮想関数はオーバーライドできない

    void bar() override;  // OK
    void baz() override;  // NG: A::baz() は仮想関数ではない
    void hage() override; // NG: A::hage() は存在しない

    void fuga() override final;
    // OK: override と final の両方を付けることもできる
}

class C : public B // NG: final クラスは継承できない
{
};

なんで関数宣言の最後に付けるのかなーと思ったんですが、これは純粋仮想関数を宣言するときの = 0 と同じグループという扱いなのだと思われます …と思っていたら、C++の江添さんの解説記事によるとどうも違うらしい。

なお、override が最初の仕様から含まれている C# とは違い、override を付けずにオーバーライドしようとしても、今まで通りにコンパイルできます(そりゃそうだ)。

final と override は Visual C++ だと 2012 から使えるようなのですが、gcc だと 4.7 からclang だと 3.0 から(ともに “Explicit virtual overrides” のところを参照)なので、今使ってる Mac の古ーい Xcode 3.2.6 (gcc は 4.2.1、 clang は 1.7)では当然サポートされていません。コードを大幅に変えた上にビルド環境まで変えるのはさすがにリスキーなので、ハッピーになれるのはしばらく先のことになります。

Trackback

no comment untill now

Add your comment now