继承

面向对象语言的特性之一

定义

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