继承

共性——>特性
父类——>子类(又叫基类和派生类)

继承的好处:减少重复代码,提高代码复用率

语法:
class 子类 :继承方式 父类

继承方式

  • 公有继承
  • 保护继承
  • 私有继承

父类中私有成员不可访问,但是会被继承,只是被编译器隐藏

![[继承方式.png]]

继承中的对象模型

父类继承过来的成员哪些属于子类对象
父类中所有非静态成员都被继承
私有属性被编译器隐藏,所以访问不到,但是被继承

构造和析构顺序

子类继承父类,创建子类对象,调用父类的构造函数

父类和子类的构造、析构顺序:

创建父类对象,调用父类构造初始化,生命周期结束,调用父类析构。
创建子类对象,由于继承父类,创建父类对象:调用父类的构造、析构。
调用顺序:
![[继承中构造、析构函数顺序.png]]

先构造父类,再构造子类析构顺序和构造相反
可以简单记成:先有爸爸,同时爸爸最后走

同名成员处理

父类、子类出现同名成员,如何通过子类对象访问父类中同名的数据:

  1. 访问子类同名成员,直接访问
  2. 父类,成员前加父类作用域 Base::成员名
s.Base::a
  1. 子类中出现同名成员,会隐藏掉父类中所有(包括重载)同名成员,因此就算调用父类中的重载函数,同样需要加作用域

同名静态成员

和非静态成员出现同名处理方法一致,但是有两种访问方式:

  1. 通过对象 “.” + 父类名 ::
  2. 通过类名
    子类名::成员名

    子类名::父类名::成员名——第一个冒号表示通过类名访问,第二个表示访问父类作用域

多继承

一个类继承多个类
语法:class 子类 : 继承方式 父类1, 继承方式 父类2…{};

父类中有同名函数出现,需加作用域区分
实际开发不建议用多继承

菱形继承 (虚继承)

![[菱形继承.png]]

问题1.二义性 2.只需要一份数据

解决:利用虚继承——继承前加上关键字virtual
最大类叫虚基类

![[虚继承.png]]

继承指针,指针指向虚基类表,表中记录偏移量,通过偏移量找到唯一数据

继承是多态的基础,虚继承的指针是后续实现多态的基础~

更多推荐