对虚拟重载函数感到困惑

时间:2013-05-12 07:20:27

标签: c++ gcc override virtual overloading

我对以下代码的编译器错误感到困惑:

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)是未定义的。

当我还为Derived添加func(int)的定义时,它可以工作。当我在Derived中定义func()和func(int)时,它也有效(如“另一个”的情况)。

显然这里有一些关于虚拟重载函数的规则,但这是我第一次遇到它,我不太明白它。有人能告诉我这到底发生了什么吗?

1 个答案:

答案 0 :(得分: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 () { }
};

有关为何发生这种情况的讨论,请参阅Why does an overridden function in the derived class hide other overloads of the base class?