c++基础知识学习---第六天
本片博客是作者在学习c++的过程中的笔记记录,希望和各位读者一起学习交流
文章目录
继承
- 继承概念
- 类之间的关系(has-A、uses-A、is-A)
- has-A:包含关系,用以描述一个类有多个‘部件类’构成,实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类
- uses-A:一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友元或对象参数传递实现
- is-A:称为“继承”,关系具有传递性
- 继承相关概念
继承是类之间定义地一种重要关系
一个B类继承A类,或称从类A派生类B,类A称为基类(父类),类B称为派生类(子类) - 派生类的定义
- 语法
class 派生类名:基类名表
{
数据成员和成员函数声明
}; - 基类名表构成:
访问控制 基类名1,访问控制 基类名2,… ,访问控制 基类名n - 访问控制表示派生类对基类的继承方式,使用关键字:
public 公有继承
private 私有继承
protected 保护继承 - c++中的继承方式(public、private、protected)会影响子类的对外访问属性
- 语法
- 继承重要说明
- 子类拥有父类的所有成员变量和函数子类就是一种特殊的父类
- 子类对象可以当作父类对象使用
- 子类可以拥有父类没有的方法和属性
- 类之间的关系(has-A、uses-A、is-A)
- 派生类的访问控制
派生类继承了基类的全部成员变量和成员方法(除了构造和析构之外的成员方法),但是这些成员的访问控制属性,在派生的过程中是可以调整的。- c++中的继承方式会影响子类的对外访问属性
public继承:父类成员在子类中保持原有的访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中的public成员会变成protected
父类中的protected成员仍然为protected
父类中private成员仍然为private - private成员在子类中依然存在,但是却无法访问。不论何种方式继承基类,派生类都不能直接使用基类的私有成员
- c++中子类对外访问属性控制表:
- c++中的继承方式会影响子类的对外访问属性
- 继承中的构造和析构
-
类型兼容性原则
类型兼容性原则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员
类型兼容规则中所指的替代情况包括以下情况:- 子类对象可以当作父类对象使用
- 子类对象可以直接赋值给父类对象
- 子类对象可以直接初始化父类对象
- 父类指针可以直接指向子类对象
- 父类引用可以直接引用子类对象
子类就是特殊的父类(base *p = &child;)
-
继承中的对象模型
子类是由父类成员叠加子类新成员得到的
继承中的构造和析构:
在子类对象进行构造时,需要调用父类构造函数对其继承得来的成员进行初始化
在子类对象进行析构时,需要调用父类析构函数对其继承得到的成员进行清理 -
继承中的构造析构调用原则
1. 子类对象在创建时会首先调用父类的构造函数
2. 父类的构造函数执行结束后,执行子类的构造函数
3. 当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
4. 析构函数调用的先后顺序于构造函数相反 -
继承与组合混搭情况下,构造与析构的调用原则
先构造父类,再构造成员变量,最后构造自己
先析构自己,再析构成员变量,最后析构父类 -
继承中的同名成员变量处理方法
当子类成员变量与父类成员变量同名时,子类依然从父类继承同名成员,在子类中通过作用域分辨符“::”进行同名区分(在派生类中使用基类的同名成员,显式地使用类名限定符),在默认情况下是使用子类的同名成员,同名成员存储在内存中的不同位置 -
派生类中的static关键字
基类定义的静态成员,将被所有派生类共享
根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质(遵守派生类的访问控制)
派生类中访问静态成员- 类名::成员
- 对象名.成员
-
- 多继承(不常用)
- 多继承的应用:
- 多继承概念
一个类有多个直接基类的继承关系称为多继承 - 语法:
class 派生类名:访问控制 基类名1,访问控制 基类名2,… ,访问控制 基类名n
{
数据成员和成员函数声明
} - 多继承的派生类构造和访问
- 多个基类的派生类构造函数可以在初始时调用基类构造函数初始化数据成员
- 执行顺序与单继承构造函数类似,多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序
- 一个派生类对象拥有多个直接或间接基类的成员,不同成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别
- 多继承概念
- 虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。
如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象
要使这个公共基类在派生类中只产生一个子对象,必须对这个基类声明为虚继承,是这个基类成为虚基类
虚继承声明使用关键字 virtual
在加上virtual关键字后,会给类加上一些属性
- 多继承的应用: