当我继承这个函数时,为什么我没有匹配函数

Dog*_*Dog 8 c++ inheritance

可能重复:
重载函数隐藏在派生类中

我有A类和B类(A的子类)

A类有功能

virtual void foo(int, int);
virtual void foo(int, int, int);
Run Code Online (Sandbox Code Playgroud)

当我尝试做的时候

B级功能

virtual void foo(int, int);
Run Code Online (Sandbox Code Playgroud)

当我尝试用类调用foo(int,int,int)时,编译器不会让我,因为它说

no matching function for foo(int,int,int)
candidate is foo(int,int);
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 11

之所以与C++的名称查找和重载解析方式有关.C++将从表达式类型开始并向上查找,直到找到与指定名称匹配的成员.然后,它将仅考虑在已发现类型中具有该名称的成员的重载.因此,在这种情况下,它只考虑foo声明的方法B,因此无法找到重载.

最简单的补救方法是添加using A::fooclass B强制编译考虑这些过载也.

class B : public A {
  using A::foo;
  virtual void foo(int, int);  
};
Run Code Online (Sandbox Code Playgroud)