【问题标题】:Why does C++ overload resolution not look at base class methods when derived class methods are not viable? [duplicate]当派生类方法不可行时,为什么 C++ 重载解析不查看基类方法? [复制]
【发布时间】:2021-08-24 16:09:39
【问题描述】:

编译失败的例子:

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++ inheritance overload-resolution


    【解决方案1】:

    该问题与重载解析无关,而是在重载解析之前执行的名称查找。在unqualified name lookup中,当在类B的范围内找到名称f时,名称查找停止;包括A 在内的进一步范围将不会被检查,A::f 将根本找不到。结果,只有B::f 被放入重载集,然后执行重载解析并且找不到合适的函数。

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

    【讨论】:

      【解决方案2】:

      因为B::f 隐藏 A::f

      你需要将A::f显式拉入B的范围内:

      class B : public A
      {
      public:
          using A::f;
      
          // ...
      };
      

      【讨论】:

        猜你喜欢
        • 2018-11-11
        • 2014-12-23
        • 2017-04-03
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多