永发信息网

C++重载,隐藏,覆盖的区别

答案:2  悬赏:60  手机版
解决时间 2021-12-24 15:13
  • 提问者网友:寂寞撕碎了回忆
  • 2021-12-23 17:33
原帖在这里

http://wenwen.sogou.com/z/q723024690.htm

我问的是想知道为什么程序的结果是这些,无法理解,楼下2位说一堆性质有啥用。之后自己弄明白了这个问题。
在C++中,除了override(覆盖,重写)和overload(重载)之外,还有个隐藏属性。
先看下override和overload区别,
override:必须是父类和子类之间,且父类函数以virtual关键字开头,且函数名,参数,返回值一样。
overload:必须是同一个类范围内,两个函数的函数名相同,但参数个数和类型必须有一样不同。
上述给的例子发生在2个类之间,不是overload的范畴,是覆盖和隐藏。
隐藏,是发生在父类和子类直接,具有相同的函数名,但参数可以相同也可以不相同,如果父类函数没有virtual关键字,那么子类函数参数可以和父类不同也可以相同,如果父类函数有virutal关键字,子类函数参数必须与父类函数不同。

对于上述normal_func,其实是隐藏,对于virtual_func,其实是覆盖,对于覆盖,不管是用基类指针还是父类指针调用virtual_func,都是调用的派生类的virtual_func,而在隐藏方式中,
用基类指针和派生类指针调用函数normal_func时,系统会进行区分,
基类指针调用时,系统执行基类的normal_func,而派生类指针调用时
,系统“隐藏”了基类的f(),执行派生类的normal_func,
这也就是“隐藏”的由来。
最佳答案
  • 五星知识达人网友:千夜
  • 2021-12-23 18:52
其实你说的基类指针和派生类指针的问题,本质是virtual的影响。
对于标识为virtual的函数,其函数列表会被派生类更新,所以不管使用哪种调用方式都会是子类的方法。
对于非virtual的函数,其函数列表不会被更新,仅仅是添加了新的函数。在子类调用时,由于后添加的将原来的隐藏了,所以是调用子类的方法;而如果使用父类指针调用,由于在父类的函数列表中是没有子类的函数的,所以就变成了父类的函数。
至于重载,它是指相同的方法名称却有不同的调用参数(据说有的语言可以支持返回类型的重载)。
全部回答
  • 1楼网友:鸠书
  • 2021-12-23 19:00
满意回答中对于重载的解释明显有误,重载要求必须是在同一个类中,而不是在基类和派生类中,他的这种解释更确切的说应该是隐藏,而且覆盖的解释也有误,覆盖要求必须是virtual关键字声明的虚函数,而且在不同类,同名同参,如果为非虚函数,则为隐藏~~~
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯