重载的子类函数无法调用相似名称的父类

2 c++ inheritance scope class name-lookup

我假设这是“只是不是如何工作”的问题之一,但我不明白为什么。为什么需要有资格B的号召,A小号StartA::。如果我更改B::Start()为,B::DoSomethingElse()我可以在Start()没有A::. 那么发生了什么?

#include <iostream>
#include <string>

class A {
  public:
    void Start(){
        
    }
};

class B : public A {
    public:
        void Start(int x){
            Start();     // cannot call this  
            A::Start();  // can call this  
        }
};
Run Code Online (Sandbox Code Playgroud)

Chr*_*sMM 6

从 C++ 标准(草案,强调我的)[basic.lookup.unqual]/1

在 6.4.1 中列出的所有情况下,按照每个类别中列出的顺序搜索范围以查找声明;一旦找到 name 的声明, name 查找就会结束。如果未找到声明,则程序格式错误。

因此该Start名称已在 内找到class B,因此查找停止。重载解析仅在名称查找完成后发生[basic.lookup]/1

...重载解析 (16.3) 在名称查找成功后发生....

因此,即使 classAB具有不同的参数,这在这里也不起作用,因为名称查找已经完成。

当您这样做时A::Start(),您将使用限定名称查找,您实际上是在其中指定函数出现的类,因此名称解析将找到该版本。