静态绑定与动态绑定

  多态(polymorphism)就是指不同对象收到相同消息时会执行不同的操作。
通俗地讲,就是用一个相同的名字定义许多不同的函数,这些函数可以针对不同数据类型实现相同或者相似的功能,
即所谓的“一个接口,多种实现”。
       C++中的多态性与联编这一概念密切相关。一个源程序需要经过编译、连接才能形成可执行文件,在这个过程中要把调用函数名与对应函数关联在一起,这个过程就是绑定(binding),又称联编。
             
  绑定分为静态绑定和动态绑定。
  静态绑定又称静态联编,是指在编译程序时就根据调用函数提供的信息,把它所对应的具体函数确定下来,
即在编译时就把调用函数名与具体函数绑定在一起。
  动态绑定又称动态联编,是指在编译程序时还不能确定函数调用所对应的具体函数,只有在程序运行过程中才能够确定函数调用所对应的具体函数,即在程序运行时才把调用函数名与具体函数绑定在一起。
  
 
静态绑定:编译时绑定,通过对象调用
动态绑定:运行时绑定,通过地址实现
                        
C++的多态性
                       
 静态多态性:函数多态性——函数重载和运算符重载
                        模板多态性——C++模板(类模板、函数模板)
 动态多态性:继承和虚函数,虚函数(只有用地址才能实现动态多态性)
                        
只有采用“指针->函数()”“引用变量.函数()”的方式调用C++类中的虚函数才会执行动态绑定。
对于C++中的非虚函数,因为其不具备动态绑定的特征,所以不管采用什么样的方式调用,都不会执行动态绑定。
              
     C++语言成员函数的调用和绑定方式总结

 

        
代码形式
对于虚函数
对于非虚函数
作用
绑定方式
作用
绑定方式
类名::函数()
调用指定类的指定函数
静态绑定
调用指定类的指定函数
静态绑定
对象名.函数()
调用指定对象的指定函数
静态绑定
调用指定对象的指定函数
静态绑定
引用变量.函数()
调用引用对象所属类的指定函数
动态绑定
调用引用变量所属类的指定函数
静态绑定
指针->函数()
调用引用对象所属类的指定函数
动态绑定
调用指针变量所属类的指定函数
静态绑定

 

                            
注:被引用对象所属类 是 指针 或 引用 指向的对象的实际类型;
    引用变量所属类、指针变量所属类 是 定义 引用变量、指针变量的类型;
    以上两种类型可能相同,也可能不同。
                        
    从上表可以看出,执行动态绑定的只有通过地址,即只有通过指针或引用变量才能实现,而且还必须是虚函数。从概念上来说,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全
 
由于静态多态性是在编译时就确定了函数调用的具体函数,不需要在执行程序时从多个同名函数中匹配调用函数,所以执行速度快。
而动态多态性需要在执行程序时从多个同名函数中匹配调用函数,所以它比静态多态性执行效率低,但它提供了更多的灵活性、问题的抽象性和程序的可维护性。
 
参考 http://blog.csdn.net/livelylittlefish/article/details/2171521
posted @   曦花  阅读(2442)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示