C++ ———— 5(继承)

一、继承

1、C语言使用库函数的目的:

​ 实现代码的重用,提高开发效率、减少错误、让大规模的代码关注点转移到软件的结构上。

2、C++中代码重用:

  • 简单层次的类库的提供
  • 继承(inherritance)
  • 多态(Polymorphism)
  • 泛型编程(Generic Programming)

3、继承

继承:

在一个已存在的类的基础上建立一个新的类。

概念:

  • 基类(父类):已存在的类
  • 派生类(子类):新建的类
  • 类的继承:一个新的类从已有类的那里获得其已有的特性
  • 类的派生:从已有的类产生一个新的子类

alt

特点:

  • 派生类会继承基类几乎所有的数据成员和成员函数。
  • 派生类是基类的具体化,而基类是是派生类的抽象

派生:

class 子类名 : 权限 基类1, 权限 基类2, ......
{

}

知识点:

  • 基类私有成员不能被继承
  • 公有继承:派生类对象只能访问基类的public成员,派生类内部只能继承基类的public/protected成员
  • 保护继承/私有继承(私有同保护继承同理):派生类对象不能访问基类的任何成员,派生类内部只能访问基类的public/protected成员
  • C++默认为private私有继承

image-20250901142114017alt

基类成员权限 public 继承(公有继承) protected 继承(保护继承) private 继承(私有继承)
public 派生类中为 public 派生类中为 protected 派生类中为 private
protected 派生类中为 protected 派生类中为 protected 派生类中为 private
private 派生类中 不可访问 派生类中 不可访问 派生类中 不可访问

构造顺序:

  • 先基类构造,(再成员对象的结构),最后派生类构造

析构函数:

  • 先派生类析构,(再成员对象析构),最后基类析构(总体按照压栈后的出栈顺序调用析构)

基类构造问题:

  • 派生类构造函数初始化列表,默认调用基类的无参构造。
  • 当基类有有参构造时,则必须在派生类构造函数初始化列表中,去显示调用基类有参构造

基类和派生类转换问题:

  • 派生类可以隐式转换为基类
Base b;		//父类
Child d;	//子类
b = d;		//可以隐式转换

Base *p = new Child();	//也有向上隐式转换

Base &obj = d;			//向上隐式转换

Child *p2 = (Child *) new Base(12);		//向下显式转换,派生类独有成员被赋值0,派生类的基类部分被new的Base转换的值赋值

继承中的关系:

  • is-a关系:常见的公有继承。派生类对象也是一个基类对象,基类对象能够做的任何操作(对象!不是类),派生类对象也可以。
  • has-a关系:一种聚合(组合、包含)关系,成员对象的定义,一个类中有另一个类的对象作为成员。
  • is-implement-a关系:(作为...来实现)关系,例如:数组可以实现栈,但是用栈继承数组,这样来实现是不合理的。表达的是一个实体实现了另一个实体所定义的契约、接口或规范 。这种关系最常见于接口与类、抽象类与具体类之间。
  • is-like-a关系:不能使用公有继承建立,也不能使用has-a实现

4、多重继承

  • 多继承:一个子类的直接基类不止一个
  • 单一继承:一个子类的基类只有一个
  • 多继承的多重构造顺序: 从左往右依次构造基类,之后是成员对象,最后是派生类构造
  • 多重继承二义性: 名字二义性: 解决方式:1.虚基类 2.作用域访问符