C++为什么要有"继承类函数隐藏"这种特性?

werewq8q 2014-03-28 06:27:37
如下所示的代码,编译不过:

#include<stdio.h>
struct A{
void f(int){printf("A\n");}
};
struct B{
void f(){printf("B\n");}
};
struct C:A, B{
void f(){printf("C\n");}
};
int main(void){
C obj;
obj.f(1);
return 0;
}

错误是在f(1)这一行。看了下往上的解释说,继承类如果有同名的函数但是函数参数不同,就会自动隐藏基类的同名函数。
我觉得C++的这个规定怎么看起来是多次一举呢? 既然函数重载就是为了方便使用同一个函数名+不同的参数,为什么在继承的时候,子类不能"重载"父类的函数?

是不是说会造成编译的一些二义性还是什么? C++标准有没有章节对此规定或者做出解释?
...全文
395 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyowinwin 2014-04-03
  • 打赏
  • 举报
回复
       obj.A::f(1);    
    obj.B::f();
    obj.C::f();   // obj.f()
这个时候 就很好理解C++设计者的思路了吧! 在查询函数的时候,编译器的负担多轻松啊
ithiker 2014-03-30
  • 打赏
  • 举报
回复
引用 3 楼 u013573183 的回复:
原因很多,我说一个 一个类不应该把手伸到别人的身体里,管好自己就行,所以重载父类这种事情不符合要求,如果确实要重载,应该有父类自己重载
赞同
FrankHB1989 2014-03-30
  • 打赏
  • 举报
回复
根本原因是C++在这里使用了更加普遍的name lookup规则。不像Java之类,这里需要判断是否可见的仍然是名称而不是实体,和类型也好继承关系也好根本无关——和类作用域以外一致。这样的好处是语言规则使用上的正交和简洁——如果撇开name lookup规则的复杂性本身就充满了槽点的话(总之如果这里再特殊处理,C++就更加复杂了;另外,重载的规则可以说是C++中最复杂的部分,和这个没什么可比性)。
Pump天天学习 2014-03-29
  • 打赏
  • 举报
回复
另外,lz对函数重载的理解也不完全 如果局部的声明一个函数,则该函数将屏蔽而不是重载外层作用域中的同名函数
Pump天天学习 2014-03-29
  • 打赏
  • 举报
回复
C++标准不清楚 不过C++ Primer可以解决lz的疑问 编译器会在该类中查找函数,如果找不到,就沿着继承链向上找 这个查找只是名字查找,不涉及到参数的检查,只要找到了函数的名字,就不向上找了(即使它的参数是错误的)
f_liu 2014-03-29
  • 打赏
  • 举报
回复
obj.A::f(1);
f_liu 2014-03-29
  • 打赏
  • 举报
回复
书上指出:派生类对基类成员函数的重定义或重载会影响基类成员函数在派生类中的可见性,基类的同名成员函数会被派生类重载的同名函数所隐蔽。如要调用则obj.A::f(1;
zhcosin 2014-03-29
  • 打赏
  • 举报
回复
因为天知道你是真的在重载,还是一时手贱写丢了参数,在这两个选择中,C++编译器选择了后者。
苍蝇①号 2014-03-29
  • 打赏
  • 举报
回复
name lookup 的问题。
unituniverse2 2014-03-29
  • 打赏
  • 举报
回复
鸵鸟是鸟但是不会飞。 参考类似的原理。
ri_aje 2014-03-29
  • 打赏
  • 举报
回复
name lookup 的问题。 楼主需要的行为可以通过 using f; 解决。
敬畏者 2014-03-28
  • 打赏
  • 举报
回复
原因很多,我说一个 一个类不应该把手伸到别人的身体里,管好自己就行,所以重载父类这种事情不符合要求,如果确实要重载,应该有父类自己重载
碼上道 2014-03-28
  • 打赏
  • 举报
回复
看java编程思想的时候,看到作者提及到这个问题。java和c++处理这个问题的方式不同,作者做了一下比较。
刚刚找了个电子版看了一下,作者认为c++这样做的原因是



个人这样,对于那些继承体系较深的情况,突然derived从很上的某个based 中继承了一个f(int),但是这有些牵强,一般情况我们还是希望不要这样,但是标准这样定了,估计改起来也麻烦。
taodm 2014-03-28
  • 打赏
  • 举报
回复
你确实有权认为这是多次一举,但是这已经是写入标准了的,还能如何? 如果你好奇这些东西,可以去看C++之父亲自写的《C++语言设计与演化》,应该会对你正确掌握C++有帮助。不过,好像没有你这个问题的直接答案。

65,206

社区成员

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

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