C++多态之动态绑定
来源:互联网 发布:吉诺比利巅峰数据 编辑:程序博客网 时间:2024/06/18 08:46
动态绑定:
定义:
动态绑定是将一个过程调用与相应代码链接起来的行为。是指与给定的过程调用相关联的代码,只有在运行期才可知的一种绑定,它是多态实现的具体形式。
原理:
C++中,通过基类的引用或指针调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对的实际类型所定义的。
C++中动态绑定是通过虚函数实现的。而虚函数是通过一张虚函数表实现的。这个表中记录了虚函数的地址,解决继承、覆盖的问题,保证动态绑定时能够根据对象的实际类型调用正确的函数。
在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。
缺点:
1.动态绑定在函数调用时需要在虚函数表中查找,所以性能比静态函数调用稍低。
2.通过基类类型的指针访问派生类自己的虚函数将发生错误。
虚函数、动态绑定、运行时多态之间的关系:
虚函数是动态绑定的基础;动态绑定是实现运行时多态的基础。
动态绑定两个条件:
(1) 只有虚函数才能进行动态绑定,非虚函数不进行动态绑定。
(2) 必须通过基类类型的引用或指针进行函数调用。
对应的有静态绑定
静态绑定是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态绑定仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。简单的讲,就是上下文无关,在编译时就可以确定其类型。
动态绑定与静态绑定
静态绑定:编译时绑定,通过对象调用
动态绑定:运行时绑定,通过地址实现
示例:
#include <iostream>using namespace std;class Base{public: virtual void f1() { cout<<"Base"<<endl; }};class Drived1:public Base{public: void f1() { cout<<"Drived1"<<endl; }};class Drived2:public Base{public: void f1() { cout<<"Drived2"<<endl; }};void Test(Base* pB){ pB->f1 ();}int main(){ Base b; Drived1 d1; Drived2 d2; Test(&b); Test(&d1); Test(&d2); return 0;}
输出结果:
Base
Drived1
Drived12
- objective-c之动态绑定
- Objective-C动态绑定和多态
- C++多态之动态绑定
- object-c 继承、多态动态绑定 第八天
- C++(四)动态绑定
- Object-c消息之运行时动态绑定
- [玩玩Objective-C]之动态绑定
- Objective-c 特性之多态、动态类型和动态绑定
- Objective-c 特性之多态、动态类型和动态绑定
- Objective-c 特性之多态、动态类型和动态绑定
- Java之动态绑定
- 多态与动态绑定
- 多态和动态绑定
- 动态绑定和多态
- 动态绑定和多态
- 动态绑定和多态
- 多态和动态绑定
- 多态的动态绑定
- 【Rsync项目实战】备份全网服务器数据
- Appium for Win7 环境搭建
- Hibernate 添加数据 二 (多对多)
- 最小生成树模版题
- C++四种类型转换
- C++多态之动态绑定
- 构建高并发高可用的电商平台架构实践3
- 各类排序算法复杂度、稳定性比较
- Hibernate 查询数据
- Android 测试环境搭建(Win7)
- scala(一)/Haskel(一)
- 整理一下算法和数据结构
- 《ACM程序设计》书中题目 N
- 解决C++ 无法从void 转换为LRESULT的方法详解