可能重复:
C++ overload resolution
Why does an overridden function in the derived class hide other overloads of the base class?
为什么以下示例:
class A {
public:
void f(int x){ }
};
class B : public A {
public:
void f(float a, int b){ }
};
int main(){
B *b = new B;
b->f(1);
};
导致:
test.cpp:在函数'int main()'中: test.cpp:13:错误:没有匹配函数来调用'B :: f(int)' test.cpp:8:注意:候选者是:void B :: f(float,int)
f(int)
和f(float, int)
有不同的签名。为什么会导致错误?
修改
我明白这是隐藏的。我问为什么会发生这种情况?
答案 0 :(得分:7)
基本上,你没有重载基类方法;通过重新定义方法f
,您隐藏基类方法。您可以通过将其明确地包含在子类范围中来防止这种情况:
class B : public A {
public:
using A::f;
void f(float a, int b){ }
};
答案 1 :(得分:3)
通过在B类中声明另一个名为'f'的函数,你隐藏了在A中声明的'f'。
要使重载与继承一起工作,请在类B中添加using指令。
class B : public A {
public:
using A::f;
void f(float a, int b){ }
};
这是因为编译器在B类的范围内查找并且只找到一个必须考虑重载解析的方法。
答案 2 :(得分:2)
A :: f被B:f隐藏。使用using
指令重载基类方法。
class B : public A {
public:
using A::f;
void f(float a, int b){ }
};
答案 3 :(得分:1)
void f(float a, int b){ }
会在基类中隐藏void f(int x){ }
。
为什么?
阅读this回答。
解决方案
using A::f; // add this above f's definition in the derived class