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

来源:互联网 发布:活动策划面试技巧知乎 编辑:程序博客网 时间:2024/05/16 06:26
 
面向对象程序语言设计中应该注意的几个基本知识点
2008年01月15日 星期二 下午 06:42

       如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,基类的函数将被隐藏。

(注意,别与重载混淆,虽然函数名相同参数不同应称之为重载,但这里不能理解为重载,因为派生类和基类不在同

一名字空间作用域内。这里理解为隐藏)

       如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继

承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生

中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏。

       如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被

藏。(注意别与覆盖混淆,这里理解为隐藏)。

      如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数有virtual关键字。此时,基类的函数不

会被“隐藏”。(在这里,你要理解为覆盖哦^_^)。

      插曲:基类函数前没有virtual关键字时,我们叫重写更为顺口些,在有virtual关键字时,我们叫覆盖更为合

些,戒此,我也希望大家能够更好的理解C++中一些微妙的东西。费话少说,我们举例说明吧。函数重载是和多态不一样的,函数重载通过传不同的参数,选择执行不同函数执行。而多态是通过把子类对象赋给

父类对象(大逆不道?!:)),让父类对象具有子类对象的方法。

    多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。

     重载也是用统一的对外接口来完成不同的功能。那么两者有什么区别呢?

    重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表

,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定

了。

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

赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。

     不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译

就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。