サブクラスの仮想メソッドが実際にスーパークラスの仮想メソッドをオーバーライドしていることを確認する方法はC++にありますか?リファクタリングするときに、メソッドを忘れて、なぜ呼び出されないのか疑問に思うことがありますが、メソッドのシグネチャを変更するのを忘れたため、何もオーバーライドされなくなりました。
ありがとう
サブクラスの仮想メソッドが実際にスーパークラスの仮想メソッドをオーバーライドしていることを確認する方法はC++にありますか?リファクタリングするときに、メソッドを忘れて、なぜ呼び出されないのか疑問に思うことがありますが、メソッドのシグネチャを変更するのを忘れたため、何もオーバーライドされなくなりました。
ありがとう
C ++ 11では、次のoverride
識別子を使用して可能です。
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.
};
これは、キーワードを使用したC++11の機能です。override
Visual C ++ 2005以降を使用している場合は、C++11のサポートを必要とせずに明示的なオーバーライド機能も使用できます。
さまざまなコンパイラの実装状況については、Apachestdcxxのサイトを参照してください。
GCC 4.7.0はこの機能を実装し、MSVCはVisual C ++ 11.0以降の標準化されたバージョンを実装します(Visual Studio 2012のリリースに付属します)。