2 c++ inheritance scope class name-lookup
我假设这是“只是不是如何工作”的问题之一,但我不明白为什么。为什么需要有资格B的号召,A小号Start用A::。如果我更改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)
从 C++ 标准(草案,强调我的)[basic.lookup.unqual]/1:
在 6.4.1 中列出的所有情况下,按照每个类别中列出的顺序搜索范围以查找声明;一旦找到 name 的声明, name 查找就会结束。如果未找到声明,则程序格式错误。
因此该Start名称已在 内找到class B,因此查找停止。重载解析仅在名称查找完成后发生[basic.lookup]/1:
...重载解析 (16.3) 在名称查找成功后发生....
因此,即使 classA和B具有不同的参数,这在这里也不起作用,因为名称查找已经完成。
当您这样做时A::Start(),您将使用限定名称查找,您实际上是在其中指定函数出现的类,因此名称解析将找到该版本。