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

时间:2010-11-24 20:29:54

标签: c++ inheritance

  

可能重复:
  overloaded functions are hidden in derived class

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

A类有功能

virtual void foo(int, int);
virtual void foo(int, int, int);

当我尝试

B级功能

virtual void foo(int, int);

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

no matching function for foo(int,int,int)
candidate is foo(int,int);

3 个答案:

答案 0 :(得分:10)

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

最简单的补救措施是将using A::foo添加到class B中以强制编译器考虑这些重载。

class B : public A {
  using A::foo;
  virtual void foo(int, int);  
};

答案 1 :(得分:2)

B类中的覆盖隐藏了具有相同名称的A类方法。 (您是否有编译器警告?大多数编译器警告隐藏的虚拟方法。)

为避免这种情况,请添加

using A::foo;

到B级(适用于public / protected / private部分)。

答案 2 :(得分:1)

使用

B b;
b.A::foo(1,2,3);

例如。