我有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);
答案 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);
例如。