若派生类重写基类的虚函数,其函数参数是否都要保持一致?

xychzh 2011-02-27 11:48:22
如果是的话,
那么这样可不可以:?

class A
{
public:
virtual void test();
};
class B : public A
{
public:
virtual void test(int n=10);
};


如果参数不一致是什么情况?就不会被当成是虚函数重载?而是两个不同的函数?
...全文
1230 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2011-02-28
  • 打赏
  • 举报
回复
可以带默认参数啊,但子类override的时候不要对默认参数做任何变动就好,父类是什么样,子类也什么样。
xychzh 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 steedhorse 的回复:]
准确讲:参数要完全一致,返回值可以“协变”(比如父类函数返回A类指针,子数返回B类指针,但B是A的子类)。而“默认参数”则不纳入考量。
但子类override父类的虚函数时,如果在默认参数方面与父类不同,那是个很坏的编程习惯。编译器顶多给个警告,可这样的代码会导致“出乎意料”的结果。
[/Quote]

那就是说只要是虚函数重写,就最好保持参数完全一致,连默认参数也不要带是吧.那OK了
晨星 2011-02-28
  • 打赏
  • 举报
回复
准确讲:参数要完全一致,返回值可以“协变”(比如父类函数返回A类指针,子数返回B类指针,但B是A的子类)。而“默认参数”则不纳入考量。
但子类override父类的虚函数时,如果在默认参数方面与父类不同,那是个很坏的编程习惯。编译器顶多给个警告,可这样的代码会导致“出乎意料”的结果。
pengzhixi 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
“重载”就是指“两个不同的函数”啊,你最后的问题写错了。
你这种情况既不是虚函数重写(override),也不是函数重载(overload),而是发生了名字隐藏,从子类对象上调不到那个无参函数了。
[/Quote]

up ,即使是重写,那么在默认参数方面建议不要使用。
xychzh 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
“重载”就是指“两个不同的函数”啊,你最后的问题写错了。
你这种情况既不是虚函数重写(override),也不是函数重载(overload),而是发生了名字隐藏,从子类对象上调不到那个无参函数了。
[/Quote]

恩,我写错了,我把重载和重写搞混了。
那么,是不是只要是虚函数重写,那参数就一定要保持一致?就连但默认参数也不可以,是吧?
晨星 2011-02-28
  • 打赏
  • 举报
回复
是啊,我想表达的也是这个“必需一致”的意思。
父类有子类便也有,父类没有子类便没有;
而且,如果父类有的话,父类用的默认值是多少,子类也用多少。
purewqk 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 steedhorse 的回复:]
是啊,我想表达的也是这个“必需一致”的意思。
父类有子类便也有,父类没有子类便没有;
而且,如果父类有的话,父类用的默认值是多少,子类也用多少。
[/Quote]
学习了~~~
segen_jaa 2011-02-28
  • 打赏
  • 举报
回复
楼上解析到位,介绍了一个好习惯。
xychzh 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 steedhorse 的回复:]
可以带默认参数啊,但子类override的时候不要对默认参数做任何变动就好,父类是什么样,子类也什么样。
[/Quote]

我的意思是说,如果基类的虚函数没有带默认参数,那子类就不要带,就是我楼上贴的那段代码。
当然,如果基类的虚函数有默认参数,那派生类重写时也自然要写上默认参数.总之就是必须一致
晨星 2011-02-27
  • 打赏
  • 举报
回复
“重载”就是指“两个不同的函数”啊,你最后的问题写错了。
你这种情况既不是虚函数重写(override),也不是函数重载(overload),而是发生了名字隐藏,从子类对象上调不到那个无参函数了。

64,637

社区成员

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

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