2

コンパイラ: GCC

以下のコードでは、3 つの Foo() の署名はすべて でしたがFoo(bool b)、誰かがコードを更新し、変更するのを忘れていましたDeriveB::Foo。これはコンパイルに合格します。この種の間違いを防ぐにはどうすればよいでしょうか。

class Base {
  virtual Foo(bool b, int i);
}

class DerivedA : public Base {
  Foo(bool b, int i);
}

class DerivedB : public Base {
  Foo(bool b);
}
4

3 に答える 3

1

指定子はoverrideあなたが望むものかもしれません。Foo派生クラスの宣言で使用するとDerivedB::Foo、異なる署名を取得したため、エラーが発生します。

class Base {
  virtual Foo(bool b, int i);
}

class DerivedA : public Base {
  Foo(bool b, int i) override; // would be fine
}

class DerivedB : public Base {
  Foo(bool b) override; // gives an error
}

派生クラスの関数が基本クラスの関数とは異なる署名を取得した場合、または基本クラスの関数が宣言されていない場合は、エラーが発生しvirtualます。

派生クラスでオーバーライド指定子を強制的に使用する方法はないため、使用することを覚えておく必要があります。ただし、関数のシグネチャを変更すると、少なくともエラーが発生する可能性があります。オーバーライドの詳細については、こちらをご覧ください。

于 2013-10-30T01:29:47.763 に答える
1

C++11 では、override指定子を使用できます。これは、C++03 コードの MSVC による拡張機能としてもサポートされていると思います。

g ++またはclangを使用している場合-Woverloaded-virtual、コンパイラに渡すことが目的だと思います。上記の例では、g++ は次のように報告します。

so_virt.cc:2:16: warning: ‘virtual void Base::Foo(bool, int)’ was hidden [-Woverloaded-virtual]
   virtual void Foo(bool b, int i);
            ^
so_virt.cc:10:8: warning:   by ‘void DerivedB::Foo(bool)’ [-Woverloaded-virtual]
   void Foo(bool b);
于 2013-10-30T02:25:12.780 に答える