多态概念
同一个事物在不同环境下具有不同的状态
虚函数概念
在函数返回值前加上 virtual 关键字
多态分类
静态多态(早绑定):在编译器编辑时确认要调用的函数
1、 函数重载
2、泛型编程
动态多态(晚绑定):在程序运行时确认将要调用的函数
1、 基类中存在虚函数
2、继承当中对基类进行重写并且
3、通过对象的指针或者引用对基类的虚函数进行调用
多态例子
公共测所分男女进行使用
对于一个人类来说,不明确到底调用男厕还是女厕
将人类继承为男人类以及女人类,并且对上厕所函数进行重写
在传参时,便可分辨到底调用男类还是女类中的上厕所函数
多态形成条件
1、 基类中存在虚函数
2、 继承当中对基类进行重写并且
3、 通过对象的指针或者引用对基类的虚函数进行调用
重写
在派生类中重写的函数与基类中的对应函数的原型一致 即函数返回值函数名以及参数列表均相同
重写特例
1、协变(返回值类型可以不一样)
2、析构函数(其函数名不同)
不可定义为虚函数的成员函数
1、构造函数与拷贝构造函数(调用该函数时并没有对象,所以无法通过对象进行指针或引用的调用)
2、友元函数(友元函数不是类的成员函数)
3、 static修饰的静态成员函数(静态成员函数无法通过对象指针调用)
抽象类(接口类)的概念
含有纯虚函数的类
纯虚函数指 在虚函数的参数列表后面加上‘= 0’
多态调用原理
1、派生类对象在其内存中的前四个字节中维护了一张虚表的入口地址
2、虚函数的调用
(1)先通过指针找到虚表的入口
(2)传递对应的参数(this指针,以及当前虚函数的参数)
(3)从虚表中取得对应的虚函数
(4)调用该虚函数
不同继承下带有虚函数的对象模型
1、单继承
(1)先将基类中的虚函数拷贝到派生类中
(2)如果派生类对该虚函数进行重写,那么则替换虚表中相同偏移量的位置的虚函数为子类的虚函数
(3)如果派生类有新增的虚函数,则将该虚函数的地址按照次序(新增虚函数有多个)放在虚表的最后
2、多继承
(1)先将基类中的虚函数拷贝到派生类中
(2)如果派生类对该虚函数进行重写,那么则替换虚表中相同偏移量的位置的虚函数为子类的虚函数
(3)将派生类新增的虚函数地址按照声明的次序放在第一个基类虚表的最后
3、菱形继承
4、虚拟继承
5、菱形虚拟继承
谢谢!!!!!