(十四)继承

1.继承的好处:减小重复代码(class 子类 : 继承方式 父类 {})

  1. 子类,也成为派生类,继承父类的所有属性.
  2. 父类,也称为基类,被子类继承
  3. 派生类中的成员包括从基类中继承来的(共性)和自己增加的(个性)

2.继承方式(父类的私有权限,子类以三种继承方式都无法访问)

公有继承(public):继承后访问权限不变

保护继承(protected):继承后访问权限变为保护

私有继承(private):继承后访问权限变为私有

继承方式图解

3.继承中的对象模型:

  1. 父类中所有非静态成员属性都会被子类继承下去
  2. 父类中私有成员属性是被编译器隐藏了,因此访问不到,但确实被继承下去了

4.继承中的构造和析构顺序:父类先构造,子类后构造(子类先析构,父类后析构)

  1. 子类继承父类后,当创建子类对象,也会调用父类的构造函数

5.继承同名成员的处理方式

  1. 子类对象访问子类同名成员,直接访问即可(子类对象.子类成员)
  2. 子类对象 访问父类同名成员,需要加作用域(子类对象.父类名::父类成员)
  3. 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中的同名函数

6.同名静态成员处理方式与普通成员完全一致

7.多重继承:C++允许一个类继承多个类(class 子类 : 继承方式1 父类1, 继承方式2 父类2,…)

  1. 多重继承可能会引发父类中有同名成员出现,需要加作用域区分
  2. 实际开发不建议使用多重继承

8.菱形继承(钻石继承):两个派生类继承同一个基类,又有某个基类同时继承这两个派生类(菱形继承会产生二义性,解决方案有两种)

  1. 添加作用域运算符加以区分(有弊端,会出现两份数据,资源浪费)
  2. 虚继承(virtual):在继承之前加上关键字virtual变为虚继承,被虚继承的父类(基类)称为虚基类
  3. 虚继承之后,两份数据共享一份内存,因此解决了二义性(两个类产生了各自的虚基类指针vbptr,分别指向各自的虚基类表vbtable,虚基类表具有不同的偏移量,因此可以指向唯一的数据)