4

以下のコードに関するコンパイラ エラーについて混乱しています。

class Base {
public:
  virtual ~Base () { }
  virtual void func () { }
  virtual void func (int) { }
  virtual void another () { }
  virtual void another (int) { }
};

class Derived : public Base {
public:
  void func () { }
};

int main () {
  Derived d;
  d.func();
  d.func(0);
  d.another();
  d.another(0);
}

gcc 4.6.3 を使用すると、上記のコードは d.func(0) で、Dervied::func(int) が未定義であるというエラーを引き起こします。

func(int) の定義も Derived に追加すると、機能します。Derived で func() も func(int) も定義していない場合にも機能します (「別の」場合のように)。

明らかに、仮想オーバーロードされた関数に関していくつかの規則がここで行われていますが、これに遭遇したのはこれが初めてで、よくわかりません。誰かがここで何が起こっているのか正確に教えてもらえますか?

4

1 に答える 1

11

でオーバーライドfunc()するとDerived、これが非表示になりfunc(int)ます。

gccこれについて警告することができます:

$ g++ -Wall -Woverloaded-virtual test.cpp
test.cpp:5:16: warning: 'virtual void Base::func(int)' was hidden [-Woverloaded-virtual]
test.cpp:12:8: warning:   by 'virtual void Derived::func()' [-Woverloaded-virtual]

これは次の方法で修正できますusing

class Derived : public Base {
public:
  using Base::func;
  void func () { }
};

これが発生する理由については、派生クラスのオーバーライドされた関数が基本クラスの他のオーバーロードを隠すのはなぜですか?を参照してください。

于 2013-05-12T07:24:37.923 に答える