重载的子类函数不能调用类似名称的父类



我假设这是一个;只是不知道它是如何工作的";问题,但我不明白为什么。为什么我需要用A::限定BAStart的调用。如果我将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(在名称查找成功后发生。。。。

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

当您执行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,必须使用限定名称。

最新更新