我假设这是其中一个“只是不是如何运作”的问题,但我不明白为什么。 为什么我需要用a::
限定b
对a
sstart
的调用。 如果我将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++标准(草案,强调mine)[basic.lookup.unqual]/1
:
在6.4.1中列出的所有情况下,按照每个相应类别中列出的顺序搜索范围以查找声明; 一旦找到名称的声明,名称查找就会结束。 如果没有找到声明,则程序的格式不正确。
因此已经在Class B
中找到了start
名称,因此停止查找。 仅在名称查找完成[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
}
};
首先在类b
的作用域中搜索,并找到这样一个名称,因为该类声明了函数start
。 即在派生类b
中声明的名称start
隐藏了在基类a
中声明的相同名称。 要访问基类a
中声明的名称start
,必须使用限定名。