多态、虚函数、动态绑定​的关系

来源:互联网 发布:js购物车思路 编辑:程序博客网 时间:2024/06/10 00:32
面相对象设计语言三大特征:封装、继承、多态。其中多态是面相对象的精髓。多态可简单概括为“一个接口,多种方法”,多态性又分为静态多态性和动态多态性,其中函数重载和运算符重载属于静态多态性;虚函数属于动态多态性。C++是依靠虚函数来实现动态多态的。
程序调用函数时,具体应使用哪个代码块是由编译器决定的。以函数重载为例,C++编译器根据传递给函数的参数和函数名决定具体要用哪个函数,成为联编或绑定(binding)。
在编译过程中进行的联编叫静态联编(static binding); 但是在某些情况下,编译器无法在编译过程中完成联编,必须在程序运行时完成选择,因此编译器必须提供一套成为“动态联编”(dynamic bining)的机制。C++通过虚函数来实现动态联编。


通过对象名访问虚函数时,调用哪个类的函数取决于定义对象名的类型。对象名是基类时,就调用基类的函数;对象类型是子类时,就调用子类的函数。


使用指针访问非虚函数时,编译器根据指针本身的类型决定要调用哪个函数,而不是根据指针指向的对象类型。


使用指针访问虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态绑定),而与指针本身的类型无关。
使用引用访问虚函数,与使用指针访问虚函数类似,但是引用一经申明后,引用变量本身无论如何改变,其调用的函数始终不变,指向开始定义的函数。


总结:
C++中的函数调用默认情况下不适用动态绑定,要使用动态绑定,需满足两个条件:
1、只有指定为虚函数的成员函数才能进行动态绑定。

2、必须通过基类类型的引用或指针进行函数调用。




0 0
原创粉丝点击