静态多态 +动态多态
1)静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。
如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。
而如果函数的调用地址不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。
2)运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。
动态多态产生条件
1)先有继承关系
2)父类中有虚函数,子类重写父类虚函数
返回值,函数名字,函数参数,必须和父类完全一致(析构函数除外)
子类中virtual关键字可写可不写,建议写
3)父类的指针或引用指向子类对象
对于有父子关系的两个类,指针或者引用是可以转换的。
动态多态 +虚函数 原理
原理

通过指针偏移调用虚函数

多态中的 类型转换
向上类型转换 +向下类型转换

重载 重定义 重写 (区分)
重载
同一作用域的同名函数
- 同一个作用域
- 参数个数,参数顺序,参数类型不同
- 和函数返回值,没有关系
- const 也可以作为重载条件 //do(const Teacher& t){} do(Teacher& t)
重定义
隐藏基类函数
- 有继承
- 子类(派生类)重新定义父类(基类)的同名成员(非virtual函数)
重写
覆盖基类虚函数
- 有继承
- 子类(派生类)重写父类(基类)的 virtual 函数
- 函数返回值,函数名字,函数参数,必须和基类中的虚函数一致
案列
利用多态实现计算器(案列)
常规思路
这种程序不利于扩展,维护困难,如果修改功能或者扩展功能需要在源代码基础上修改
面向对象程序设计一个基本原则:开闭原则(对修改关闭,对扩展开放)
//计算器
class Caculator{
public:
void setA(int a){
this->mA

文章介绍了静态多态与动态多态的区别,着重讲解了虚函数、继承、派生类如何实现动态多态,以及通过案例展示了如何利用抽象基类和多态改进计算器程序的可扩展性和可读性。还讨论了重载、重定义和重写的概念及其在编程中的应用。
最低0.47元/天 解锁文章
1629

被折叠的 条评论
为什么被折叠?



