首页 > 解决方案 > 当派生类方法不可行时,为什么 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

标签: c++inheritanceoverload-resolution

解决方案


该问题与重载解析无关,而是在重载解析之前执行的名称查找。在非限定名称查找中,当在fclass 范围内找到名称时B,停止名称查找;包括类在内的进一步范围A将不会被检查,A::f根本不会被发现。由于仅将结果B::f放入重载集,因此执行重载解析并且无法找到合适的函数。

名称查找如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查范围。


推荐阅读