C++两义性问题

Flammable_ice 2012-07-29 05:22:52

#include <iostream>
using namespace std;
class Base1
{public:void c(float);};
class Base2
{public: void c();};
class Dervied:public Base1,public Base2{};
int main()
{ Dervied obj;
obj.c(10);
return 0;
}


//基类1的C函数是有参数的,而基类2的C函数是无参数的。
//最后主函数中调用的是有参数的C函数,那么请问这个怎么也会有两义性?
...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrankHB1989 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

Derived没有using重新声明c,于是Derived作用域内名称c的name lookup结果是Base1::c或Base2::c,有二义性。
注意是名称c,此时不用知道c是不是函数。也就是说在类型检查前,更在确定重载候选前。
至于访问权限,是指public之类的。ISO C++11 10.2/1 ... Name lookup takes place before access co……
[/Quote]
没有using重新声明c→没有重新声明c。
直接重新声明c也行,把Base1::c和Base2::c都隐藏了,无二义性。

FrankHB1989 2012-07-29
  • 打赏
  • 举报
回复
Derived没有using重新声明c,于是Derived作用域内名称c的name lookup结果是Base1::c或Base2::c,有二义性。
注意是名称c,此时不用知道c是不是函数。也就是说在类型检查前,更在确定重载候选前。
至于访问权限,是指public之类的。ISO C++11 10.2/1 ... Name lookup takes place before access control (3.4, Clause 11).这里不用考虑。


Flammable_ice 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
同求为什么,定义了好像也二义
[/Quote]

是的。定义了也有二义性。求真相!求解答!
Flammable_ice 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
因为重载只发生在函数定义时
[/Quote]
我不知道你说的是否是对的?
另外我再补充下两点:(1)二义性检查在访问控制权限之前进行。(2)二义性检查在类型检查之前进行。
其中的访问控制权限和类型检查是什么意思? 不太清楚啊 分别举个例子说明呗。
hen_hao_ji 2012-07-29
  • 打赏
  • 举报
回复
同求为什么,定义了好像也二义
时间坐标 2012-07-29
  • 打赏
  • 举报
回复
因为重载只发生在函数定义时

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧