6

サブクラスの仮想メソッドが実際にスーパークラスの仮想メソッドをオーバーライドしていることを確認する方法はC++にありますか?リファクタリングするときに、メソッドを忘れて、なぜ呼び出されないのか疑問に思うことがありますが、メソッドのシグネチャを変更するのを忘れたため、何もオーバーライドされなくなりました。

ありがとう

4

2 に答える 2

9

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.

};
于 2012-05-21T18:46:20.733 に答える
1

これは、キーワードを使用したC++11の機能です。override

Visual C ++ 2005以降を使用している場合は、C++11のサポートを必要とせずに明示的なオーバーライド機能も使用できます。

さまざまなコンパイラの実装状況については、Apachestdcxxのサイトを参照してください。

GCC 4.7.0はこの機能を実装し、MSVCはVisual C ++ 11.0以降の標準化されたバージョンを実装します(Visual Studio 2012のリリースに付属します)。

于 2012-05-21T18:47:19.067 に答える