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

原帖在这里

http://zhidao.baidu.com/question/2139849548712992708.html

我问的是想知道为什么程序的结果是这些,无法理解,楼下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,
这也就是“隐藏”的由来。

其实你说的基类指针和派生类指针的问题,本质是virtual的影响。
对于标识为virtual的函数,其函数列表会被派生类更新,所以不管使用哪种调用方式都会是子类的方法。
对于非virtual的函数,其函数列表不会被更新,仅仅是添加了新的函数。在子类调用时,由于后添加的将原来的隐藏了,所以是调用子类的方法;而如果使用父类指针调用,由于在父类的函数列表中是没有子类的函数的,所以就变成了父类的函数。
至于重载,它是指相同的方法名称却有不同的调用参数(据说有的语言可以支持返回类型的重载)。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-24
写的不错~
相似回答