Bootstrap

C++学习笔记7(继承)

继承

一、基本语法

class SuperClass{

};

class SubClass : public SuperClass{

};

二、继承方式

class SubClass : public SuperClass1,public SuperClass2{

};

代码里的public就是这个子类继承父类的继承方式
两个父类中有同名成员时用作用域区分

继承方式的分类

父类的私有,所有继承都无法访问

  • 公共继承
    继承父类中除私有外的所有,且继承内容的权限都和父类保持一致
  • 保护继承
    继承父类中除私有外的所有,且继承内容的权限都变为protected
  • 私有继承
    继承父类中除私有外的所有,且继承内容的权限都变为private

在这里插入图片描述

三、继承中的对象模型

子类继承了父类所有非静态成员属性都会被子类继承下去
父类中的私有成员属性只是被编译器隐藏了,是访问不到,不是没有继承

四、构造和析构顺序

1、父类的构造函数
2、子类的构造函数
3、子类的析构函数
4、父类的析构函数

五、同名成员处理

当子类与父类出现同名的成员时,

  • 访问子类同名成员——>直接访问即可
  • 访问父类同名成员——>需要加作用域(子类对象名.父类名::属性名)
    子类对象名后面有一个点

子类的同名成员函数会隐藏掉父类中所有的同名函数(即重载函数也无法通过参数不同调用),如果想访问父类中被隐藏的同名函数需要加作用域

六、同名静态成员处理方式

问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据

方法一:

  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域
    和上述同名成员的处理方式一样

方法二:

静态成员可以直接通过类名访问

  • 子类中的静态成员: 子类名::静态成员名

  • 父类中的静态成员: 父类名::静态成员名
    或者 子类名::父类名::静态成员名(第一个::表示通过类名访问,第二个::表示找的是父类作用域下的::)

七、菱形继承(钻石继承)

概念

​ 两个派生类继承同一个基类
​ 又有某个类同时继承者两个派生类

问题

  1. 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。

  2. 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。

解决方法

利用虚继承
在继承语法中加入virtual关键字
被virtual修饰的父类被称为虚基类
(若B,C都是A的子类,E是B,C的子类,通常把A修饰成虚基类)
此时B,C中的同名成员(从A中继承下来的)共用一个内存,所以会被同时修改

class 子类名:virtual public 父类名{}
;