4月
04
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)では当然サポートされていません。コードを大幅に変えた上にビルド環境まで変えるのはさすがにリスキーなので、ハッピーになれるのはしばらく先のことになります。
no comment untill now