静态绑定与动态绑定
多态(polymorphism)就是指不同对象收到相同消息时会执行不同的操作。
通俗地讲,就是用一个相同的名字定义许多不同的函数,这些函数可以针对不同数据类型实现相同或者相似的功能,
即所谓的“一个接口,多种实现”。
C++中的多态性与联编这一概念密切相关。一个源程序需要经过编译、连接才能形成可执行文件,在这个过程中要把调用函数名与对应函数关联在一起,这个过程就是绑定(binding),又称联编。
绑定分为静态绑定和动态绑定。
静态绑定又称静态联编,是指在编译程序时就根据调用函数提供的信息,把它所对应的具体函数确定下来,
即在编译时就把调用函数名与具体函数绑定在一起。
动态绑定又称动态联编,是指在编译程序时还不能确定函数调用所对应的具体函数,只有在程序运行过程中才能够确定函数调用所对应的具体函数,即在程序运行时才把调用函数名与具体函数绑定在一起。
静态绑定:编译时绑定,通过对象调用
动态绑定:运行时绑定,通过地址实现
C++的多态性
静态多态性:函数多态性——函数重载和运算符重载
模板多态性——C++模板(类模板、函数模板)
动态多态性:继承和虚函数,虚函数(只有用地址才能实现动态多态性)
只有采用“指针->函数()”或“引用变量.函数()”的方式调用C++类中的虚函数才会执行动态绑定。
对于C++中的非虚函数,因为其不具备动态绑定的特征,所以不管采用什么样的方式调用,都不会执行动态绑定。
C++语言成员函数的调用和绑定方式总结
代码形式
|
对于虚函数
|
对于非虚函数
|
||
作用
|
绑定方式
|
作用
|
绑定方式
|
|
类名::函数()
|
调用指定类的指定函数
|
静态绑定
|
调用指定类的指定函数
|
静态绑定
|
对象名.函数()
|
调用指定对象的指定函数
|
静态绑定
|
调用指定对象的指定函数
|
静态绑定
|
引用变量.函数()
|
调用被引用对象所属类的指定函数
|
动态绑定
|
调用引用变量所属类的指定函数
|
静态绑定
|
指针->函数()
|
调用被引用对象所属类的指定函数
|
动态绑定
|
调用指针变量所属类的指定函数
|
静态绑定
|
注:被引用对象所属类 是 指针 或 引用 指向的对象的实际类型;
引用变量所属类、指针变量所属类 是 定义 引用变量、指针变量的类型;
以上两种类型可能相同,也可能不同。
从上表可以看出,执行动态绑定的只有通过地址,即只有通过指针或引用变量才能实现,而且还必须是虚函数。从概念上来说,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。
由于静态多态性是在编译时就确定了函数调用的具体函数,不需要在执行程序时从多个同名函数中匹配调用函数,所以执行速度快。
而动态多态性需要在执行程序时从多个同名函数中匹配调用函数,所以它比静态多态性执行效率低,但它提供了更多的灵活性、问题的抽象性和程序的可维护性。
参考 http://blog.csdn.net/livelylittlefish/article/details/2171521
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现