多态:一种事物多种形态
C++多态:调用一个函数名,传入不同的参数,执行不同的函数体
函数重载就是一种多态的体现!
- 静态多态和动态多态
什么静态:
静态链接(库)--在编译阶段会将静态库链接到可执行文件中
什么是动态:
动态链接(库)--在运行阶段才会将动态库链接到可执行文件中
总结: 静态(编译阶段)和动态(运行阶段)的区别: 链接的时刻不同
静态多态(静态绑定):调用一个函数,在编译阶段就知道应该执行哪一个函数体
体现在函数重载
动态多态(动态绑定):调用一个函数,在运行阶段才知道应该执行哪一个函数体
体现在继承+虚函数中
绑定:就是函数调用与函数体进行了关联
总结实现动态多态的条件:
- 一定要继承,一个父类多个子类
- 父类要中要有虚函数,并且子类要重写这个虚函数
(有加virtual就是重写—覆盖,没有加virtual是重定义—隐藏)
- 通过父类的指针或者是引用去操作子类对象,然后调用虚函数就会触发这个动态的多态!
隐藏:是重定义
覆盖:是重写
- 多态存在的问题
为什么在设计类的时候,建议把父类的析构函数写成虚函数呢?
因为如果用父类的指针去操作子类对象,使用delete去释放父类对象的时候,不会执行子类的析构函数,如果在子类的构造中有用new的方式动态的开空间,就没法做释放的动作,就会造成内存泄漏!
为什么不执行子类的析构函数,就会造成内存泄漏呢?
析构函数的作用是资源释放,如果有在子类构造中通过new或者malloc动态分配内存空间,势必要在子类的析构函数中通过delete或者free去释放对应堆区空间;没有执行子类的析构,空间不会被释放,就会造成内存泄漏!
- 重定义、重写、重载的区别
重载:一定是在同一个作用域内,函数名相同,参数不同,与返回值类型无关的一组函数!参数不同:参数个数、类型、顺序不同
重定义—隐藏:继承关系 子类写了一个和父类同名的函数,与参数这些无关
重写—覆盖:继承关系 子类重写了上父类的虚函数,必须保证 函数类型、函数名、参数是一模一样