静态绑定与动态绑定
多态(polymorphism)就是指不同对象收到相同消息时会执行不同的操作。
通俗地讲,就是用一个相同的名字定义许多不同的函数,这些函数可以针对不同数据类型实现相同或者相似的功能,
即所谓的“一个接口,多种实现”。
C++中的多态性与联编这一概念密切相关。一个源程序需要经过编译、连接才能形成可执行文件,在这个过程中要把调用函数名与对应函数关联在一起,这个过程就是绑定(binding),又称联编。
绑定分为静态绑定和动态绑定。
静态绑定又称静态联编,是指在编译程序时就根据调用函数提供的信息,把它所对应的具体函数确定下来,
即在编译时就把调用函数名与具体函数绑定在一起。
动态绑定又称动态联编,是指在编译程序时还不能确定函数调用所对应的具体函数,只有在程序运行过程中才能够确定函数调用所对应的具体函数,即在程序运行时才把调用函数名与具体函数绑定在一起。
静态绑定:编译时绑定,通过对象调用
动态绑定:运行时绑定,通过地址实现
C++的多态性
静态多态性:函数多态性——函数重载和运算符重载
模板多态性——C++模板(类模板、函数模板)
动态多态性:继承和虚函数,虚函数(只有用地址才能实现动态多态性)
只有采用“指针->函数()”或“引用变量.函数()”的方式调用C++类中的虚函数才会执行动态绑定。
对于C++中的非虚函数,因为其不具备动态绑定的特征,所以不管采用什么样的方式调用,都不会执行动态绑定。
C++语言成员函数的调用和绑定方式总结
|
代码形式
|
对于虚函数
|
对于非虚函数
|
||
|
作用
|
绑定方式
|
作用
|
绑定方式
|
|
|
类名::函数()
|
调用指定类的指定函数
|
静态绑定
|
调用指定类的指定函数
|
静态绑定
|
|
对象名.函数()
|
调用指定对象的指定函数
|
静态绑定
|
调用指定对象的指定函数
|
静态绑定
|
|
引用变量.函数()
|
调用被引用对象所属类的指定函数
|
动态绑定
|
调用引用变量所属类的指定函数
|
静态绑定
|
|
指针->函数()
|
调用被引用对象所属类的指定函数
|
动态绑定
|
调用指针变量所属类的指定函数
|
静态绑定
|
注:被引用对象所属类 是 指针 或 引用 指向的对象的实际类型;
引用变量所属类、指针变量所属类 是 定义 引用变量、指针变量的类型;
以上两种类型可能相同,也可能不同。
从上表可以看出,执行动态绑定的只有通过地址,即只有通过指针或引用变量才能实现,而且还必须是虚函数。从概念上来说,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。
由于静态多态性是在编译时就确定了函数调用的具体函数,不需要在执行程序时从多个同名函数中匹配调用函数,所以执行速度快。
而动态多态性需要在执行程序时从多个同名函数中匹配调用函数,所以它比静态多态性执行效率低,但它提供了更多的灵活性、问题的抽象性和程序的可维护性。
参考 http://blog.csdn.net/livelylittlefish/article/details/2171521

浙公网安备 33010602011771号