Jus*_*sad 5 c++ inheritance overload-resolution
编译失败的例子:
class A{
public:
int f(int a) {return a;}
};
class B: public A {
public:
int f(int a, int b) {return a + b;}
};
int calculation(int num) {
B b;
return b.f(num);
}
Run Code Online (Sandbox Code Playgroud)
在调用站点b.f(num),gcc给出以下错误消息:
错误:没有匹配的函数可供调用
B::f(int&)
基类有一个可行的候选者,但由于某种原因编译器不会考虑它。
如果我将调用重写为b.A::f(num),那么它就可以正常工作。我不明白为什么这A::是必要的。为什么 的A::f重载解析逻辑不将其视为可行的候选者b.f?
因为B::f 隐藏 A::f。
您需要明确地纳入A::f以下范围B:
class B : public A
{
public:
using A::f;
// ...
};
Run Code Online (Sandbox Code Playgroud)