c++ - 重载的子类函数不能调用同名的父类
问题描述
我假设这是那些“只是不是它如何工作”的问题之一,但我不明白为什么。为什么我需要限定B
对 sA
的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
}
};
解决方案
来自 C++ 标准(草案,强调我的)[basic.lookup.unqual]/1
:
在 6.4.1 中列出的所有情况下,按照每个相应类别中列出的顺序搜索范围以查找声明;一旦找到 name 的声明, name 查找就结束。如果没有找到声明,则程序格式错误。
所以Start
名称已经在 内找到class B
,因此停止查找。重载解析仅在名称查找完成后发生[basic.lookup]/1
:
...名称查找成功后发生重载解决方案 (16.3) ....
因此,即使 classA
和B
具有不同的参数,这也不会在这里发挥作用,因为名称查找已经完成。
当您这样做时A::Start()
,您将使用限定名称查找,您实际上是在其中指定函数出现的类,因此名称解析将找到该版本。
推荐阅读
- javascript - 如何在 Ionic 中使用 html 视频 onerror 事件
- python - Django模板未显示
- windows-server-2016 - 当虚拟目录具有特定名称时,IIS 返回 404
- javascript - 我可以更改标签内的文本吗?
- javascript - 在单页应用程序中点击返回按钮后单击不起作用
- dns - 来自自定义域的网站与来自主机域的网站不同(样式表未在自定义域中更新)
- r - 计算R中列表或向量中的偶数
- python - CalledProcessError:命令'['convert','--version']'返回非零退出状态1
- django - Django 通用视图不适用于 PUT 、 GET 、 UPDATE 、 PATCH
- c# - 从主菜单场景加载我的游戏后音频停止播放