一.多继承
多继承状态下类型兼容性原则是可以用的。
在继承多个类时用逗号隔开。(有顺序)
在多继承中基类会根据基类学院在派生类中的排布进行偏移。
二.多继承的二义性
1、多继承中的二义性: 通过类名 和 域解析符解决
2、菱形继承:构造函数会被构造两次
三.虚继承
虚继承: 解决多继承中的二义性 ===> 仅适用于有公共基类的情况
继承之前添加一个关键字: virtual ===> 会为派生类添加一个 虚基类表(vbptr) 指针
虚继承的情况下派生类中的对象排序 : 虚基类指针排列在最前面
1、排列非虚继承的类成员
2、vbptr
3、自己的成员
4、虚基类成员
四.根据对象的不同调用不同的函数
多态:一种调用函数有多种不同的形态。==>功能扩展(不改变原有的代码)
动态的实现:继承+虚函数+类型兼容性原则
重写:虚函数的重定义叫 函数重写
虚函数:如果基类有一个函数是虚函数,派生类继承的时候,虚函数重写的时候不管前面有没有加 virtual 默认都是虚函数
看实际调用的函数
1、看指针 —> pa 是 Animal * 类型指针
2、看函数类型 --> eat 是一个普通函数
3、调用 Animal::eat ----> 知道具体该调用的函数 —> 静态联编 早期联编
五.多态的实现
借助于虚函数,其实也就是借助于虚函数指针 vfptr
虚函数表:每个类拥有一张虚函数表
虚函数指针是分步初始化的,执行到哪个构造函数的时候,该指针及指向该类的虚函数表。
不要用基类指针操作派生类对象数组 ===> 基类和派生类的步长不一致
在继承中,为了避免内存泄漏,将基类的析构函数设为虚析构函数,通过基类指针释放派生类对象。
六.纯虚函数
纯虚函数 : 虚函数,只需要声明,不需要实现, 将函数定义换成 = 0;
抽象类: 拥有纯虚函数的类
1、抽象类不能实例化对象 —> 不能创建变量
2、派生类必须实现全部的纯虚函数,如果不全部实现,则派生类将变为抽象类
3、抽象类可以定义指针,用来操作派生类对象
C++模拟接口:类中只有纯虚函数,没有变量
不建议使用多继承,但是可以继承多个接口