一、静态多态
函数重载,编译器确定
1.函数重载
- 允许在同一作用域中声明多个功能类似的同名函数
- 这些函数的参数列表,参数个数或者参数类型或者参数顺序不一样
注意: 不能通过返回值类型来区别重载
2.原理
- 函数名修饰
- 编程过程
预编译:把头文件当中的函数声明拷贝到源文件,避免编译过程中的语法分析找不到函数定义
编译:语法分析,同时进行符
链接号汇总 (函数名)
汇编:生成函数名到函数地址的映射,方便之后通过函数名找到函数定义位置,从而执行函数
链接:将多个文件中的符号表汇总合并 - objdump -t *o
_ZN+类长度+类名+函数名长度+函数名+E +类型首字母
二、动态多态
虚函数重写,运行时确定
1. 虚函数重写
- 在基类的函数前加上 virtual 关键字,在派生类重写该函数
- 运行时将会根据对象的类型来调用相应的函数
- 如果对象的类型是基类,则调用基类的函数
- 如果对象的类型是派生类,则调用派生类的函数
2. 原理
- 早绑定
编译器编译时已经确定对象调用的函数的地址 - 晚绑定
若类使用 virtual 函数,则会为类生成虚函数表(一维数组,存放了虚函数地址),类对象构造时会初始化该虚函数表指针
虚函数表指针在构造函数中初始化
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs