C++学习笔记-继承

面向对象有三个特性:封装继承和多态。实现一个类就是实现了一个对象的封装。继承是为了表示对象和对象之间的关系,生物学中有界门纲目科属种的说法,比如说喜鹊、麻雀、燕子它们有各自的特性,可以将它们看成一个个类,它们都属于鸟类,因为它们有鸟类共同的特征,会飞啊、有羽毛的啊。

继承就是抽象出对象的共性成为一个父类,子类用继承的方式获得父类的共性,并且子类有权拥有自己的个性,也能对父类的共性做个性化的修改。

本文并不详细介绍继承的概念,而是记录继承中一些关键点和注意事项。

访问控制

访问控制符 作用
public 公有继承,公开的大家都能访问
protected 保护继承,子类允许父类
private 私有继承,只能通过 get() 这样的函数访问

访问控制的存在能够保证让对象在继承中任然保持封装特性,亲兄弟也得明算账,能让你访问的就让你访问,不允许的我用 private 提前说明,你也别来碰。

代码示例

类的兼容性原则

类的兼容性原则意思就是在使用父类的地方可以使用其子类来替代。因为子类通过公有继承已经获得了父类除了构造函数、析构函数之外的属性和方法。

  1. 子类对象可以当做父类对象来使用
  2. 子类对象可以赋值给父类对象
  3. 父类对象可以用子类对象来初始化
  4. 父类指针可以指向子类对象

子类创建和销毁的过程

子类继承了父类,有了父类的属性和方法,所以再创建和销毁的过程中必不可少地要调用父类的构造方法和析构函数。

子类创建到销毁的过程

  1. 调用父类的构造函数
  2. 执行子类的构造函数
  3. 当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
  4. 析构函数调用的先后顺序与构造函数相反

代码示例

多继承和虚继承

C++ 允许一个类继承自多个类,同时拥有多个类的特性,这被称为多继承。多继承采用 class C: public Child1, public B 的形式实现,在继承的类之间添加逗号即可。

虚继承指的是类实现了多继承,其中继承的多个类中有两个或者以上都继承自同一个父类。

虚地址会造成一个二义性问题,我们知道类继承自另外一个类就会获得另外一个类的属性,在多继承中被继承的两个类来自于同一父类,就会产生下图所示的情况。

C++学习笔记-继承

class C 有重复获取了两次 class B 中的变量 b,而 class B 有一个变量 b,class C 就面对使用哪个 b 的二义性问题。

解决方案就是让 class B1 和 class B2 在继承时都使用 vitural 修饰。

C++学习笔记-继承

virtual 对子类声明为虚继承,使这个子类成为虚基类,使公共父类在子类中只产生一个子对象,