重写 重载 隐藏
来源:互联网 发布:西安软件公寓公租房 编辑:程序博客网 时间:2024/05/21 09:56
转自:http://blog.sina.com.cn/s/blog_94a4b2160100yccx.html
重写 重载 隐藏
(2011-11-17 16:20:05)杂谈
分类: c“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,具体规则:
如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,基类的函数将被隐藏。(注意别与重载混淆,虽然函数名相同参数不同应称之为重载,但这里不能理解为重载,因为派生类和基类不在同一名字空间作用域内。这里理解为隐藏) 如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继承到派生类的中。vtable此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏。 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。(注意别与覆盖混淆,这里理解为隐藏)。 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数有virtual关键字。此时,基类的函数不会被“隐藏”。[
-----------------------就近原则----取派生类,
,这称为函数的覆盖(override)。构成函数覆盖的条件为:
n 基类函数必须是虚函数(使用virtual关键字进行声明)。
n 发生覆盖的两个函数要分别位于派生类和基类中。
n 函数名称与参数列表必须完全相同。
由于C++的多态性是通过虚函数来实现的,所以函数的覆盖总是和多态关联在一起。在函数覆盖的情况下,编译器会在运行时根据对象的实际类型来确定要调用的函数。
这种情况称为函数的隐藏。所谓隐藏,是指派生类中具有与基类同名的函数(不考虑参数列表是否相同),从而在派生类中隐藏了基类的同名函数。
初学者很容易把函数的隐藏与函数的覆盖、重载相混淆,我们看下面两种函数隐藏的情况:
(1)派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有使用virtual关键字。此时基类的函数将被隐藏,而不是覆盖(请参照上文讲述的函数覆盖进行比较)。
(2)派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有virtual关键字,基类的函数都将被隐藏。注意这种情况与函数重载的区别,重载发生在同一个类中。
当隐藏发生时,如果在派生类的同名函数中想要调用基类的被隐藏函数,可以使用“基类名::函数名(参数)”的语法形式。例如,要在Derived类的fn(int)方法中调用Base类的fn()方法,可以使用Base::fn()语句。
有的读者可能会想,我怎样才能更好地区分覆盖和隐藏呢?实际上只要记住一点:函数的覆盖是发生在派生类与基类之间,两个函数必须完全相同,并且都是虚函数。那么不属于这种情况的,就是隐藏了。
- 重载 重写 隐藏
- 重载重写覆盖隐藏
- 重载 重写 隐藏
- 重写 重载 隐藏
- 重载,重写,隐藏,覆盖
- 重载、重写与隐藏
- C++ 重载、重写、隐藏
- 重载、重写、隐藏
- 重载-重写-隐藏
- 重写 重载 隐藏
- 重载、覆盖、重写(隐藏)
- 重载、重写、隐藏
- 重载、重写、隐藏
- 重载、隐藏和重写
- 重载、重写(覆盖)、隐藏
- C# 重载 重写 覆盖 隐藏
- 重写和重载与隐藏
- 重载,重写(覆盖),隐藏
- 指针的特点
- interview~~~
- poj 3450/poj 3080 多串最长公共子串 后缀数组
- 轻松解决Linux安装Eclipse方法
- 浅谈C#之字符串
- 重写 重载 隐藏
- TimesTen内存数据库-第三章 定义缓存集合
- 函数memset、memcpy、strcpy
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程
- TimesTen内存数据库-第四章 管理缓存集合
- 重构的必然性 ---一个阶乘容器 + 测试驱动开发 +极限(XP)编程
- TimesTen内存数据库-第五章 使用缓存集合
- Visual 6.0 代码对但还是提示有错
- 从第一个字符串中删除第二个字符串中的所有字符