【问题标题】:Confused about virtual overloaded functions [duplicate]对虚拟重载函数感到困惑[重复]
【发布时间】:2013-05-12 07:20:27
【问题描述】:

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

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) 时,它也可以工作(如“另一个”的情况)。

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

【问题讨论】:

    标签: c++ gcc overriding virtual overloading


    【解决方案1】:

    当您在Derived 中覆盖func() 时,这会隐藏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?

    【讨论】:

    • 嘿谢谢!!关于 -Woverloaded-virtual 和修复的提示非常有用;我什至不知道我有的问题的好答案。 :-)
    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多