继承
面向对象语言的特性之一
定义
class A:public B{
//A继承B类
}
在逻辑上应满足:A具有B的全部特点,A“是”B,即派生类是基类。比如:男人是人,大学生是学生……
特点
(1)A继承B的所有成员,其存储体积等于基类对象体积+自己的成员变量的体积,可以看成是A对象“包含”了B对象;
基类对象的存储位置位于派生类对象新增的成员变量之前
(2)A不能访问B的私有成员,而是要通过B的成员函数来访问
覆盖
派生类中可以定义与基类中同名的成员(一般是函数)。
默认访问派生类中的成员,如果要访问基类的成员,要使用作用域符号::,比如
A a;
a.func(); //调用A中的func
a.B::func(); //调用基类中的func
派生类的构造函数
创建派生类对象时,要先调用基类的构造函数,以初始化从基类继承的成员变量
调用基类构造函数的两种方式
- 显式调用:在派生类的构造函数中,为基类构造函数提供参数(初始化列表)
- 隐式调用:调用基类的默认构造函数
注意:若基类定义了含参的构造函数,则不会自动生成缺省的无参构造函数,此时在派生类构造函数中必须给出参数
封闭派生类对象的构造函数调用顺序
若派生类中含成员对象,即其也是封闭类,则
先调用基类,再调用成员对象,最后调用派生类自己的构造函数。
析构函数顺序相反
public继承的赋值规则
派生类对象可以赋值给基类对象
- 符合“逻辑”
派生类对象可以初始化基类对象引用
- 同上
派生类对象地址可以赋值给基类指针
- 因为派生类存储空间前面部分是基类成员,但是要注意指针范围
如果派生方式是private或protected,上述不成立
直接基类和间接基类
(套娃)
声明派生类时,只需列出直接基类,会自动继承上级所有成员
复合关系
“有”的关系,类C中有成员k,而k是类D的对象,则C和D是复合关系
在逻辑上应满足:D对象是C对象的固有属性或组成部分
与继承的区别
男人“是”人,男人和人是继承关系;圆“有”特殊的点(圆心),圆和点是复合关系
程序设计与算法(三)C++面向对象程序设计 https://www.bilibili.com/video/BV1Ns411n7ui?p=11