您的位置:首页 > 其它

面向对象程序语言设计中应该注意的几个基本知识点

2011-09-10 16:28 405 查看
面向对象程序语言设计中应该注意的几个基本知识点
2008年01月15日 星期二 下午 06:42
如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,基类的函数将被隐藏。
(注意,别与重载混淆,虽然函数名相同参数不同应称之为重载,但这里不能理解为重载,因为派生类和基类不在同
一名字空间作用域内。这里理解为隐藏)
如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继
承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生
类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏。

如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被
隐藏。(注意别与覆盖混淆,这里理解为隐藏)。
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数有virtual关键字。此时,基类的函数不
会被“隐藏”。(在这里,你要理解为覆盖哦^_^)。
插曲:基类函数前没有virtual关键字时,我们叫重写更为顺口些,在有virtual关键字时,我们叫覆盖更为合
些,戒此,我也希望大家能够更好的理解C++中一些微妙的东西。费话少说,我们举例说明吧。函数重载是和多态不一样的,函数重载通过传不同的参数,选择执行不同函数执行。而多态是通过把子类对象赋给
父类对象(大逆不道?!:)),让父类对象具有子类对象的方法。
多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。
重载也是用统一的对外接口来完成不同的功能。那么两者有什么区别呢?
重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表
,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定
了。

多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据

赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。
不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译器
就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: