继承
继承(class 子类(派生类) :继承方式(public/private/protect) 父类(基类))
类与类之间存在上下级关系
下级除了有上级的共性,还有自己的特性
继承的好处:减少代码重复性
三种继承方式
public: 公共继承 //不变
private: 私有继承 //全部变成私有权限
protected: 保护继承 //全部变成保护权限
//子类无法访问父类的私有成员
保护权限和私有权限的区别
在继承中:
//子类可以访问父类的保护权限
//但是不能访问父类的私有权限
构造和析构的顺序
先构造父类再构造子类
先析构子类再析构父类
子类与父类的同名成员
默认使用子类成员
使用父类成员需要 子对象名 + 父类 + 作用域限定符 + 同名成员
多继承
class A :public B,C{};
菱形继承(钻石继承)
class A{};
class B :public A{};
class C :public A{};
class D :public B,C{};
菱形继承会有二义性(继承混乱)
虚继承(virtual)
class A{};(虚基类)
class B :/*virtual*/ public A{};
class C :/*virtual*/ public A{};
class D :public B,C{};
此时class D直接继承class A;
虚继承(virtual)时创建了虚指针和虚函数表格
虚函数表格记录了动物类的地址
菱形继承类继承时也会继承到虚指针,虚指针指向的虚函数表格
尽量避免多继承和菱形继承的出现
多态(多种状态)
什么是多态?
静态多态:函数重载、运算符重载(并不存在同名函数,在编译时将函数名重写)
//在编译阶段确定多态
动态多态:虚函数
//代码组织结构清晰
//可读性强
//利于后期维护
函数重写
函数的返回值,函数名,参数,参数个数都相同时
子类重写父类
//父类的指针或者引用指向子类的对象时,子类重写父类的虚函数(使用虚函数或函数重写
0在父类和子类的同名函数前加/*virtual*/
1子类的虚函数前可以省略/*virtual*/
2子类的虚函数后可以写/*overrid*/
当有父类指针或引用指向子类对象时,通过
纯虚函数和抽象类
纯虚函数:只是给子类的虚函数提供了接口
virtual void whoAmI() = 0;
抽象类:当类中有纯虚函数时,该类也成为抽象类
抽象类不能实例化对象
当父类是纯虚函数时,子类必须重写纯虚函数,否则子类也是抽象类
虚析构
在析构函数前加/*virtual*/关键字
纯虚析构
virtual ~析构函数名()= 0;
纯虚析构函数一定要在类外定义
拥有纯虚析构函数的类也,是抽象类
简单工厂模式
按照设计图纸生产处一些具有相同特征的产品,由一个工厂对其进行生产
角色:总设计图、产品、工厂
优点:
缺点:更改产品时函数也要修改
工厂类是整个项目的核心