为了账号安全,请及时绑定邮箱和手机立即绑定

为什么派生类中的重写函数隐藏基类的其他重载?

为什么派生类中的重写函数隐藏基类的其他重载?

C++ C
猛跑小猪 2019-05-30 16:56:23
为什么派生类中的重写函数隐藏基类的其他重载?考虑一下守则:#include <stdio.h>class Base {public:      virtual void gogo(int a){         printf(" Base :: gogo (int) \n");     };     virtual void gogo(int* a){         printf(" Base :: gogo (int*) \n");     };};class Derived : public Base{public:     virtual void gogo(int* a){         printf(" Derived :: gogo (int*) \n");     };};int main(){     Derived obj;     obj.gogo(7);}得到了这个错误:>g++ -pedantic -Os test.cpp -o test test.cpp: In function `int main()': test.cpp:31: error: no matching function for call to `Derived::gogo(int)' test.cpp:21: note: candidates are: virtual void Derived::gogo(int*)  test.cpp:33:2: warning: no newline at end of file >Exit code: 1在这里,派生类的函数将使基类中所有同名函数(而不是签名函数)黯然失色。不知何故,C+的这种行为看起来不太好。不是多态。
查看完整描述

4 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

名称解析规则说,名称查找在找到匹配名称的第一个作用域中停止。这时,重载解析规则就会出现,以找到可用函数的最佳匹配。

在这种情况下,gogo(int*)在派生类作用域中找到(单独),并且由于没有从int到int*的标准转换,查找失败。

解决方案是通过派生类中的Using声明引入Base声明:

using Base::gogo;

.将允许名称查找规则查找所有候选项,因此重载解析将按照您的预期进行。


查看完整回答
反对 回复 2019-05-30
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

这是“设计”。在C+中,此类方法的重载解析如下所示。

  • 从引用的类型开始,然后转到基类型,找到第一个类型,它有一个名为“gogo”的方法。
  • 仅考虑那种类型上名为“gogo”的方法,就可以找到匹配的重载。

因为派生没有一个名为“gogo”的匹配函数,所以重载解析失败。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 640 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信