c++ - 当派生类方法不可行时,为什么 C++ 重载解析不查看基类方法?
问题描述
编译失败的例子:
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);
}
在呼叫站点b.f(num)
,gcc
给出以下错误消息:
错误:没有匹配的调用函数
B::f(int&)
基类有一个可行的候选者,但由于某种原因编译器不会考虑它。
如果我将调用重写为b.A::f(num)
,那么它可以正常工作。我不明白为什么这A::
是必要的。为什么?A::f
的重载解决逻辑不将其视为可行的候选者b.f
?
解决方案
该问题与重载解析无关,而是在重载解析之前执行的名称查找。在非限定名称查找中,当在f
class 范围内找到名称时B
,停止名称查找;包括类在内的进一步范围A
将不会被检查,A::f
根本不会被发现。由于仅将结果B::f
放入重载集,因此执行重载解析并且无法找到合适的函数。
名称查找如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查范围。
推荐阅读
- assembly - 如何通过 x86 TSS 正确设置任务切换
- javascript - 如何导航到 Puppeteer 中页面网络请求的 URL?
- oauth-2.0 - 刷新时返回当前有效的访问令牌而不是新的访问令牌
- python - 如何将值更新为 Python 字典的值和键?
- tensorflow - 在 tf.keras.Model 中自定义拟合时检查一切正常
- swift - 在 UIMapKit 注释单击上隐藏和显示视图
- python - 如何在数据框上获取值
- c++ - 用少于声明的值初始化一个 int 数组,它只会添加 0 作为值吗?
- r - 在 `dplyr` 动词中使用不带引号的字符串:`select` 和 `arrange` 工作方式不同
- python - 无法导入 numpy