《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生

上传人:E**** 文档编号:89428980 上传时间:2019-05-25 格式:PPT 页数:22 大小:339KB
返回 下载 相关 举报
《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生_第1页
第1页 / 共22页
《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生_第2页
第2页 / 共22页
《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生_第3页
第3页 / 共22页
《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生_第4页
第4页 / 共22页
《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生》由会员分享,可在线阅读,更多相关《《C++面向对象程序设计》-曹静-电子教案 第05章 类的继承与派生(22页珍藏版)》请在金锄头文库上搜索。

1、2019年5月25日星期六,C+面向对象程序设计,第5章 类的继承与派生,5.1 继承与派生 5.2 继承的三种方式 5.3 派生类的构造函数和析构函数 5.4 多继承和虚基类 5.5 赋值兼容规则,2019年5月25日星期六,C+面向对象程序设计,5.1 继承与派生,5.1.1 基类与派生类 5.1.2 派生类的声明 5.1.3 派生类生成过程,2019年5月25日星期六,C+面向对象程序设计,5.1.1 基类与派生类,以原有的类为基础产生新类,我们就说从原有的类派生出新类。在这个过程中原有的类称为基类,新类称为派生类。 汽车类派生出卡车类。在此过程中,我们称汽车类为基类,卡车类为汽车类的派

2、生类。 面向对象程序设计提供了类的继承机制,该机制自动的为派生类提供了其基类的操作和属性,大大的提高了代码的重用率。,2019年5月25日星期六,C+面向对象程序设计,5.1.2 派生类的声明,C+中声明派生类的形式为: 声明中的“基类名”是已经存在的类的名称,“派生类名”是在已存在的类的基础上通过添加成员而得到的新类。当派生类只有一个直接基类的继承情况,称为单继承。当派生类同时有多个基类的继承情况,称为多继承。,class 派生类名: 继承方式 基类名1, 继承方式 基类名2, ,继承方式 基类名n 派生类的成员声明; ;,2019年5月25日星期六,C+面向对象程序设计,5.1.3 派生类

3、生成过程,派生类生成过程中需要指定派生类的类名,继承方式和新增成员。 派生类的生成过程可分为三个步骤:吸收基类成员改造基类成员和添加新的成员。 吸收基类成员:将基类除构造函数和析构函数以外的成员全部接受。 改造基类成员:根据继承方式决定基类成员在派生类中的访问控制问题。 添加新的成员:派生类新增成员是派生类不同于基类的地方,也是继承和派生机制的关键所在。,2019年5月25日星期六,C+面向对象程序设计,5.2 继承的三种方式,5.2.1 公有继承 5.2.2 私有继承 5.2.3 保护继承,2019年5月25日星期六,C+面向对象程序设计,5.2.1 公有继承,类的继承方式为公有继承的时候,

4、基类的公有和保护成员在派生类中访问权限不变,而基类的私有成员在派生类中不可直接访问。 公有继承的应用举例。,class Circle: public Point private: float r; public: void Start(float X, float Y, float R) Point:Start(X,Y); r=R; float GetR() return r; ;,2019年5月25日星期六,C+面向对象程序设计,5.2.2 私有继承,类的继承方式为私有继承的时候,基类中的公有和保护成员被吸收后成为派生类的私有成员,而基类的私有成员在派生类中不可直接访问。 私有继承应用举例。

5、,class Circle: private Point private: float r; public:void Start(float X, float Y, float R) Point:Start(X,Y); r=R; float GetX() return Point:GetX(); float GetY() return Point:GetY(); ;,2019年5月25日星期六,C+面向对象程序设计,5.2.3 保护继承,当类的继承方式为保护继承的时候,基类中的公有和保护成员被吸收后成为派生类的保护成员,而基类中的私有成员在派生类中不可直接访问。 保护继承的例子。,class

6、Circle: protected Point private: float r; public: void Start(float X, float Y, float R) Point:Start(X,Y); r=R; float GetR() return r; float GetY() return Point:GetY(); ;,2019年5月25日星期六,C+面向对象程序设计,5.3 派生类的构造函数和析构函数,5.3.1 构造函数 5.3.2 析构函数,2019年5月25日星期六,C+面向对象程序设计,5.3.1 构造函数,派生类对象在定义的时候必须调用派生类的构造函数进行初始化工

7、作,也就是为派生类对象的数据成员赋初值。 构造函数的作用是在对象被创建时用特定的方式构造对象,将对象初始化为一个特定的状态,使此对象具有区别于其它对象的特征。 派生类对象的数据成员包括从基类继承的数据成员和派生类新增的数据成员,如果派生类有内嵌对象作为数据成员,那么派生类的数据成员还包括内嵌对象的数据成员。派生类对象定义的时候,构造函数需要完成上述数据成员的初始化工作。 派生类构造函数声明一般语法如下:,2019年5月25日星期六,C+面向对象程序设计,.3.1 构造函数,派生类类名:派生类类名(参数列表): 基类名1(参数列表1),基类名m(参数列表m), 内嵌对象名1(内嵌对象参数列表1)

8、,内嵌对象n(内嵌对象参数列表n) 派生类新增成员的初始化; ,派生类构造函数初始化时先调用基类构造函数完成从基类继承数据成员的初始化,接着调用内嵌对象的构造函数完成内嵌对象数据成员的初始化,最后才调用派生类构造函数完成新增数据成员的初始化。,2019年5月25日星期六,C+面向对象程序设计,.3.1 构造函数,派生类构造函数应用举例。,class GraduateStudent: public Student protected: int gCount; public: GraduateStudent(int gN,float gG,int gC): Student(gN,gG) cout“

9、Constructing GraduateStudentn“; gCount=gC; ;,2019年5月25日星期六,C+面向对象程序设计,.3.2 析构函数,派生类的析构函数是在派生类对象生命期结束之前对派生类新增的数据成员完成必要的清理工作。 析构函数的作用与构造函数几乎正好相反,它在对象删除前被自动调用,来完成一些清理工作,也就是一些扫尾工作。 派生类析构函数执行顺序和构造函数刚好相反:首先对派生类新增一般数据成员进行清理工作,接着对派生类内嵌对象成员进行清理工作,最后才是对基类继承的成员进行清理。这一点,大家可以根据栈区“先进后出” 的特性来理解。,2019年5月25日星期六,C+面向

10、对象程序设计,5.3.2 析构函数,派生类析构函数应用举例。,class GraduateStudent: public Student protected: int gCount; public: GraduateStudent() cout“Destructing GraduateStudentn“; ;,2019年5月25日星期六,C+面向对象程序设计,5.4 多继承和虚基类,5.4.1 派生类成员的标识与访问 5.4.2 作用域分辨 5.4.3 多继承和虚基类 5.4.4 虚基类及其派生类的构造函数,2019年5月25日星期六,C+面向对象程序设计,5.4.1 派生类成员的标识与访问,

11、派生类吸收了基类除构造函数和析构函数以外的所有成员,并添加新成员得到的类。按照派生类对象能否直接访问可以把派生类数据成员分为两种。 可见成员。派生类的可见成员也就是派生类的公有成员:派生类从基类继承的公有成员和派生类新增的公有成员. 不可见成员。派生类的不可见成员就是派生类的私有成员和保护成员:派生类从基类继承的私有、保护成员和派生类新增的私有、保护成员。,2019年5月25日星期六,C+面向对象程序设计,5.4.2 作用域分辨,作用域分辨解决的是派生类中的同名覆盖现象。 派生类声明了和基类同名的新成员(如果是函数成员则所带参数必须相同,否则就是函数重载),派生类的新成员就覆盖了从基类继承的同

12、名成员。直接访问只能访问派生类新增成员。为了能够访问基类同名成员,我们采用了作用域分辨符来完成这个任务。 作用域分辨符的使用形式:,基类名:成员名; /数据成员 基类名:成员名(参数表); /函数成员,2019年5月25日星期六,C+面向对象程序设计,5.4.3 多继承和虚基类,多继承是指一个派生类同时有多个直接基类,即一个派生类对象含有多个基类数据成员的拷贝。由于多层次的交叉派生关系,多继承中一个派生类可能保留某个基类的多个实例。 虚基类就是为了解决多继承时一个派生类可能保留某个基类多个拷贝的问题。采用虚基类的派生方式保证了在多继承中某个基类的拷贝只出现一次。,2019年5月25日星期六,C

13、+面向对象程序设计,5.4.4 虚基类及其派生类的构造函数,如果虚基类定义有带参数的构造函数,那么派生类一定要定义带参数的构造函数。 如果派生类对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数,进行初始化。,2019年5月25日星期六,C+面向对象程序设计,5.5 赋值兼容规则,赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。 赋值兼容规则替代的几种情况: 派生类的对象可以赋值给基类对象。 派生类的对象可以初始化基类的引用。 派生类的对象的地址可以赋给指向基类的指针。,2019年5月25日星期六,C+面向对象程序设计,5.5 赋值兼容规则,赋值兼容规则应用举例。,class Student ; class MiddleStudent: public Student ; class GraduateStudent: public MiddleStudent ; Student *ps; MiddleStudent ms; GraduateStudent gs; ps=,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号