12-多态

多态是C++面向对象三大特性之一

  • 静态多态:函数重载 和 运算符重载属于静态多态,复用函数名
  • 动态多态:派生类和虚函数实现运行时多态

静态多态和动态多态的区别:

  • 静态多态的函数地址早绑定——编译阶段确定函数地址
  • 动态多态的函数地址晚绑定——运行阶段确定函数地址

静态绑定和动态绑定

1. 什么是绑定?

  • 把一个方法和类对象关联起来的方法叫绑定
  • 绑定(Binding)是指将变量函数名转换为地址的过程。

2. 什么是静态绑定和动态绑定?

静态绑定

  • 静态绑定,又叫前期绑定,指在程序运行前就已经知道方法是属于哪个类的,在编译期间就可以链接到类中,定位到这个方法。静态绑定发生于编译器,因此不能利用任何运行期的信息。
  • 早期绑定意味着绑定的函数或者变量,已经在编译阶段,该语句已经被编译成“call 函数地址”或"callq 函数地址“这样的汇编指令格式(如下图所示),并且这些汇编指令中的函数地址在程序编译后是固定不变的,请记住,所有函数都有唯一的地址。 因此,当编译器(或链接器)遇到函数调用时,它将用机器语言指令替换该函数调用,该指令告诉CPU跳转到该函数的地址,因此早期绑定也叫静态绑定

动态绑定

  • 动态绑定是指在程序运行过程中,根据具体的实例对象才能具体确定是调用了哪个方法。也就是说,动态绑定只能用到运行期的可用信息。
  • 在一些带有决策性的业务逻辑的代码中,要等到用户的反馈(通常是条件判断/参数类型判定…),直到运行时,根据决策的结果才能知道将调用哪个函数。这称为后期绑定(或动态绑定),动态绑定的技术的本源就是函数指针(也可以称为函数原型)。在C ++中运行时多态正是使用的就是函数指针。

参考文献:
14 C++ 静态绑定和动态绑定 - 知乎 (zhihu.com)
第18篇:C++ 静态绑定和动态绑定 - 知乎 (zhihu.com)
c++中的函数重载、函数重写、函数重定义

comments powered by Disqus