多态、虚函数、动态绑定的关系
来源:互联网 发布:js购物车思路 编辑:程序博客网 时间:2024/06/10 00:32
面相对象设计语言三大特征:封装、继承、多态。其中多态是面相对象的精髓。多态可简单概括为“一个接口,多种方法”,多态性又分为静态多态性和动态多态性,其中函数重载和运算符重载属于静态多态性;虚函数属于动态多态性。C++是依靠虚函数来实现动态多态的。
程序调用函数时,具体应使用哪个代码块是由编译器决定的。以函数重载为例,C++编译器根据传递给函数的参数和函数名决定具体要用哪个函数,成为联编或绑定(binding)。
在编译过程中进行的联编叫静态联编(static binding); 但是在某些情况下,编译器无法在编译过程中完成联编,必须在程序运行时完成选择,因此编译器必须提供一套成为“动态联编”(dynamic bining)的机制。C++通过虚函数来实现动态联编。
通过对象名访问虚函数时,调用哪个类的函数取决于定义对象名的类型。对象名是基类时,就调用基类的函数;对象类型是子类时,就调用子类的函数。
使用指针访问非虚函数时,编译器根据指针本身的类型决定要调用哪个函数,而不是根据指针指向的对象类型。
使用指针访问虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态绑定),而与指针本身的类型无关。
使用引用访问虚函数,与使用指针访问虚函数类似,但是引用一经申明后,引用变量本身无论如何改变,其调用的函数始终不变,指向开始定义的函数。
总结:
C++中的函数调用默认情况下不适用动态绑定,要使用动态绑定,需满足两个条件:
1、只有指定为虚函数的成员函数才能进行动态绑定。
程序调用函数时,具体应使用哪个代码块是由编译器决定的。以函数重载为例,C++编译器根据传递给函数的参数和函数名决定具体要用哪个函数,成为联编或绑定(binding)。
在编译过程中进行的联编叫静态联编(static binding); 但是在某些情况下,编译器无法在编译过程中完成联编,必须在程序运行时完成选择,因此编译器必须提供一套成为“动态联编”(dynamic bining)的机制。C++通过虚函数来实现动态联编。
通过对象名访问虚函数时,调用哪个类的函数取决于定义对象名的类型。对象名是基类时,就调用基类的函数;对象类型是子类时,就调用子类的函数。
使用指针访问非虚函数时,编译器根据指针本身的类型决定要调用哪个函数,而不是根据指针指向的对象类型。
使用指针访问虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态绑定),而与指针本身的类型无关。
使用引用访问虚函数,与使用指针访问虚函数类似,但是引用一经申明后,引用变量本身无论如何改变,其调用的函数始终不变,指向开始定义的函数。
总结:
C++中的函数调用默认情况下不适用动态绑定,要使用动态绑定,需满足两个条件:
1、只有指定为虚函数的成员函数才能进行动态绑定。
2、必须通过基类类型的引用或指针进行函数调用。
0 0
- 多态、虚函数、动态绑定的关系
- 虚函数的动态绑定
- 虚函数的动态绑定
- C++ 对比虚函数的动态绑定
- 虚函数的静态绑定和动态绑定
- 静态绑定、动态绑定、虚函数的工作原理
- C++知识点复习——继承关系&动态绑定&虚函数
- c++静态绑定和动态绑定以及虚函数中缺省参数的绑定
- 虚函数与动态绑定
- 虚函数与动态绑定
- C++虚函数动态绑定
- 虚函数与动态绑定的那点事
- C++ 虚函数的深入思考 -动态绑定案例
- C++中虚函数动态绑定的实现
- 虚函数有个十分重要的作用,之动态绑定
- javascript动态绑定带参数的函数
- 动态绑定javascript函数的共用方法
- JAVA函数调用的动态绑定
- [iOS]关于横屏后状态栏不显示的问题
- 用图说明Activity的各个阶段
- Exchange Server 上针对Client端的策略设置
- POJ1062 昂贵的聘礼
- JS学习1(JS实现,JS引入)
- 多态、虚函数、动态绑定的关系
- 实用的图片轮播js代码可直接引用不需要设置css样式
- 2016/4/6微软实习练习题
- rpm package installed problem
- c++ 类模板
- test
- D20
- python笔记
- RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid item position