C++ ———— 5(继承)
一、继承
1、C语言使用库函数的目的:
实现代码的重用,提高开发效率、减少错误、让大规模的代码关注点转移到软件的结构上。
2、C++中代码重用:
- 简单层次的类库的提供
- 继承(inherritance)
- 多态(Polymorphism)
- 泛型编程(Generic Programming)
3、继承
继承:
在一个已存在的类的基础上建立一个新的类。
概念:
- 基类(父类):已存在的类
- 派生类(子类):新建的类
- 类的继承:一个新的类从已有类的那里获得其已有的特性
- 类的派生:从已有的类产生一个新的子类
特点:
- 派生类会继承基类几乎所有的数据成员和成员函数。
- 派生类是基类的具体化,而基类是是派生类的抽象
派生:
class 子类名 : 权限 基类1, 权限 基类2, ...... { }
知识点:
- 基类
私有
成员不能被继承- 公有继承:派生类对象只能访问基类的public成员,派生类内部只能继承基类的public/protected成员
- 保护继承/私有继承(
私有同保护继承同理
):派生类对象不能访问基类的任何成员,派生类内部只能访问基类的public/protected成员C++默认为private私有继承
基类成员权限 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.作用域访问符