面向对象程序语言设计中应该注意的几个基本知识点
来源:互联网 发布:活动策划面试技巧知乎 编辑:程序博客网 时间:2024/05/16 06:26
如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,基类的函数将被隐藏。
(注意,别与重载混淆,虽然函数名相同参数不同应称之为重载,但这里不能理解为重载,因为派生类和基类不在同
一名字空间作用域内。这里理解为隐藏)
如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继
承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生
类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏。
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被
隐藏。(注意别与覆盖混淆,这里理解为隐藏)。
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数有virtual关键字。此时,基类的函数不
会被“隐藏”。(在这里,你要理解为覆盖哦^_^)。
插曲:基类函数前没有virtual关键字时,我们叫重写更为顺口些,在有virtual关键字时,我们叫覆盖更为合
些,戒此,我也希望大家能够更好的理解C++中一些微妙的东西。费话少说,我们举例说明吧。函数重载是和多态不一样的,函数重载通过传不同的参数,选择执行不同函数执行。而多态是通过把子类对象赋给
父类对象(大逆不道?!:)),让父类对象具有子类对象的方法。
多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。
重载也是用统一的对外接口来完成不同的功能。那么两者有什么区别呢?
重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表
,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定
了。
多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据
赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。
不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译器
就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。
- 面向对象程序语言设计中应该注意的几个基本知识点
- VCL中一些面向对象程序语言的设计手法
- JavaScript中几个重要的知识点 ---- 面向对象
- Java中面向对象的几个注意点
- Java—面向对象设计的几个基本的原则
- 面向对象的几个基本问题
- 数据库设计中应该注意的问题
- 【小结】面向对象设计的几个基本原则
- 面向对象设计的几个原则
- 面向对象设计的几个基本原则
- Java学习笔记之面向对象的几个知识点
- Java和jsp编程中应该注意的几个常见问题
- Java和jsp编程中应该注意的几个常见问题
- Java和jsp编程中应该注意的几个常见问题
- jdbc中preparestatement操作数据库几个应该注意的问题
- C++类中,应该注意的几个题目
- Linux Shell 编程中需要注意的几个知识点
- 面向对象的基本设计原则
- 黑马程序员-面对对象
- 金蝶标准套打设置
- rac 实例不能mount
- 过程的首要目的是好的结果
- Struts2自定义拦截器实例—登陆权限验证
- 面向对象程序语言设计中应该注意的几个基本知识点
- HELLO,WORLD进阶汇编程序系列
- 凭证保存后被他人修改,但是部分凭证上的制单人没有变更。
- linux xinetd 与 telnet
- 明细分类账不想显示对方科目,怎么办?
- C/C++语言void及void指针深层探索
- MD5
- SQL语句,查询
- MyEclipse自动生成映射文件