我假设这是一个;只是不知道它是如何工作的";问题,但我不明白为什么。为什么我需要用A::
限定B
对A
的Start
的调用。如果我将B::Start()
更改为B::DoSomethingElse()
,我可以在没有A::
的情况下调用无参数的Start()
。那么发生了什么呢?
#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
}
};
来自C++标准(草案,强调挖掘([basic.lookup.unqual]/1
:
在6.4.1中列出的所有情况下,将按每个类别中列出的顺序搜索范围以查找声明一旦找到名称的声明,名称查找就会结束。如果找不到声明,则表示程序格式不正确。
因此Start
名称已在class B
中找到,因此查找将暂停。只有在名称查找完成[basic.lookup]/1
:之后才会进行过载解析
。。。过载决议(16.3(在名称查找成功后发生。。。。
因此,即使类A
和B
具有不同的参数,这在这里也不起作用,因为名称查找已经完成。
当您执行A::Start()
时,您将使用限定名称查找,在这里您实际上指定了函数出现的类,因此名称解析将找到该版本。
B
类定义中使用的不合格名称Start
class B : public A {
public:
void Start(int x){
Start(); // cannot call this
A::Start(); // can call this
}
};
首先在类CCD_ 18的范围中搜索,并且由于该类声明了函数CCD_。也就是说,在派生类B
中声明的名称Start
隐藏了在基类A
中声明的相同名称。要访问基类A
中声明的名称Start
,必须使用限定名称。