サブクラスの仮想メソッドが実際にスーパークラスの仮想メソッドをオーバーライドしていることをC++で保証する方法はありますか?ときどき私がリファクタリングすると、メソッドを忘れて、なぜ呼び出されていないのか疑問に思っていますが、メソッドのシグネチャを変更するのを忘れてしまって、何もオーバーライドしなくなりました。C++のための@overrides?
おかげ
サブクラスの仮想メソッドが実際にスーパークラスの仮想メソッドをオーバーライドしていることをC++で保証する方法はありますか?ときどき私がリファクタリングすると、メソッドを忘れて、なぜ呼び出されていないのか疑問に思っていますが、メソッドのシグネチャを変更するのを忘れてしまって、何もオーバーライドしなくなりました。C++のための@overrides?
おかげ
それはoverride
識別子と、C++ 11で可能である:これは、あなたがメソッドをオーバーライドするために失敗しているかどうかをコンパイル時に見つけることができます
struct Base {
virtual void foo() const { std::cout << "Base::foo!\n"; }
};
struct Derived : virtual public Base {
virtual void foo() const override {std::cout << "Derived::foo!\n";}
};
。ここでは、メソッドconst
を作るために無視:
struct BadDerived : virtual public Base {
virtual void foo() override {std::cout << "BadDerived::foo!\n";} // FAIL! Compiler finds our mistake.
};
これはoverride
キーワードを使用してfeature of C++11です。
Visual C++ 2005以降を使用している場合は、C++ 11のサポートを必要とせずにexplicit override featureも使用できます。
さまざまなコンパイラ間の実装状況については、Apache stdcxx's siteを参照してください。
GCC 4.7.0はこの機能を実装しています.MSVCはVisual C++ 11.0(Visual Studio 2012のリリースに同梱されています)の時点で標準化されたバージョンを実装しています。
"明示的オーバーライド機能"はC++/CLIであり、C++ではありません。 –
マイナーニックピット、オーバーライドはキーワードではなく、識別子です。私はそれがC++ 03のコードを壊すのを避けるためのキーワードではないと思う。 – juanchopanza
@CatPlusPlus - C++/CLIだけではなく、ネイティブC++でオーバーライド機能を実装するための拡張機能がMicrosoftからあることを覚えているようです。私は間違っているかもしれません。 http://msdn.microsoft.com/en-us/library/z8ew2153(v=vs.80).aspx – birryree