C程序设计课件(第2章).ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C程序设计课件(第2章).ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 课件
- 资源描述:
-
1、第第2章章 继承与派生继承与派生n本章学习重点掌握内容:本章学习重点掌握内容:n继承的概念继承的概念n派生类的建立及继承的方式派生类的建立及继承的方式n各种继承方式下基类成员的访问机制各种继承方式下基类成员的访问机制n派生类的构造函数和析构函数派生类的构造函数和析构函数n多重继承多重继承n虚基类虚基类11/14/20221第第2章章 继承与派生继承与派生n2.1 继承与派生的基础知识继承与派生的基础知识 n2.2 类的继承方式类的继承方式 n2.3 派生类的构造函数与析构函数派生类的构造函数与析构函数 n2.4 基类与派生类的转换基类与派生类的转换 n2.5 多重继承多重继承 n2.6 虚基类
2、虚基类n2.7 综合应用实例综合应用实例11/14/202222.1 继承与派生的基础知识继承与派生的基础知识2.1.1 继承与派生的基本概念继承与派生的基本概念 现实世界中,许多事物之间的并不是孤立存在的,现实世界中,许多事物之间的并不是孤立存在的,它们存在共同的特性,有细微的差别,可以使用层次它们存在共同的特性,有细微的差别,可以使用层次结构描述它们之间的关系。例如交通工具的层次结构结构描述它们之间的关系。例如交通工具的层次结构如图如图2.1所示:所示:11/14/202232.1.1 继承与派生的基本概念继承与派生的基本概念 C+通过类派生(通过类派生(Class Derivation)
3、的机制支)的机制支持继承(持继承(Inheritance)。允许程序员在保持原有类)。允许程序员在保持原有类特性的基础上进行扩展,增加功能,派生出新类。继特性的基础上进行扩展,增加功能,派生出新类。继承是面向对象程序设计中的代码复用的最重要的手段承是面向对象程序设计中的代码复用的最重要的手段之一。被继承的类称为之一。被继承的类称为基类基类(Base Class)、父类或)、父类或超类(超类(Superclass),而新产生的类称为),而新产生的类称为派生类派生类(Derived Class)或子类()或子类(Subclass)。)。基类和派基类和派生类的集合称作类继承层次结构(生类的集合称作类
4、继承层次结构(Hierarchy),继),继承呈现了面向对象程序设计的层次结构。承呈现了面向对象程序设计的层次结构。11/14/202242.1.1 继承与派生的基本概念继承与派生的基本概念 一个新类从已有的类获得其已有的特性称为继承一个新类从已有的类获得其已有的特性称为继承。通过继承,新类获得了父类的所有数据成员和成员函通过继承,新类获得了父类的所有数据成员和成员函数,并可以添加自己的数据成员和成员函数。一个基数,并可以添加自己的数据成员和成员函数。一个基类可以派生出很多的子类,一个子类也可以作为另一类可以派生出很多的子类,一个子类也可以作为另一个新类的基类,因此基类和子类是相对而言的。继承
5、个新类的基类,因此基类和子类是相对而言的。继承的方式有以下的方式有以下2种:种:单一继承和多重继承单一继承和多重继承。11/14/202252.1.1 继承与派生的基本概念继承与派生的基本概念单一继承和多重继承单一继承和多重继承请注意图中箭头的方向,本书约定,箭头表示继承的方向,由子类指请注意图中箭头的方向,本书约定,箭头表示继承的方向,由子类指向基类。向基类。11/14/202262.1.2 派生类的定义派生类的定义定义派生类的一般格式为:定义派生类的一般格式为:class 派生类名:继承方式派生类名:继承方式 基类名基类名private:成员表成员表1;/派生类增加或重写的私有成员派生类增
6、加或重写的私有成员protected:成员表成员表2;/派生类增加或重写的保护成员派生类增加或重写的保护成员public:成员表成员表3;/派生类增加或重写的公有成员派生类增加或重写的公有成员;11/14/202272.1.2 派生类的定义派生类的定义其中:基类名是已声明的类,派生类名是新生成的类名;其中:基类名是已声明的类,派生类名是新生成的类名;继承方式规定了如何访问从基类继承的成员。继承的方式包继承方式规定了如何访问从基类继承的成员。继承的方式包括:私有继承(括:私有继承(private)、保护继承()、保护继承(protected)、)、公有继公有继承(承(public)。不同的继承方
7、式下,派生类继承的父类成员的访)。不同的继承方式下,派生类继承的父类成员的访问权限是不同的。继承方式可以省略不写,默认的继承方式为私问权限是不同的。继承方式可以省略不写,默认的继承方式为私有继承(有继承(private););派生类的定义中包括子类新增加的成员和继承父类需要重写派生类的定义中包括子类新增加的成员和继承父类需要重写的成员。新添加的成员是派生类对基类的发展,说明派生类新的的成员。新添加的成员是派生类对基类的发展,说明派生类新的属性和方法;派生类继承了父类的数据成员和成员函数,有时继属性和方法;派生类继承了父类的数据成员和成员函数,有时继承来的成员函数需要改进,以满足新类的实际需要。
8、承来的成员函数需要改进,以满足新类的实际需要。C+允许在允许在派生类中重新声明和定义这些成员函数,使这些函数具有新的功派生类中重新声明和定义这些成员函数,使这些函数具有新的功能,称之为重写或覆盖。重写函数起屏蔽、更新作用,取代基类能,称之为重写或覆盖。重写函数起屏蔽、更新作用,取代基类成员,完成新功能。成员,完成新功能。11/14/202282.1.2 派生类的定义派生类的定义【例例2.1】已知盒子已知盒子CBox类,用继承与非继承两种不同的方法定类,用继承与非继承两种不同的方法定义彩色盒子义彩色盒子CColorbox类。类。分析:盒子类(分析:盒子类(Cbox)具有长、宽和高,成员函数)具有
9、长、宽和高,成员函数SetLength()、()、SetWidth()和()和SetHeight()分别设置盒子的长、宽()分别设置盒子的长、宽和高,成员函数和高,成员函数Volume()计算盒子的体积。彩色盒子除具有以计算盒子的体积。彩色盒子除具有以上特性外,还有一个数据成员上特性外,还有一个数据成员color表示盒子的颜色,相应的成表示盒子的颜色,相应的成员函数员函数SetColor()用于设置彩色盒子的颜色。()用于设置彩色盒子的颜色。11/14/202292.1.2 派生类的定义派生类的定义非继承的方式,分别定义非继承的方式,分别定义CBox类和类和CColorbox类类盒子类的定义:
10、盒子类的定义:代码见备注代码见备注彩色盒子类的定义:代码见备注彩色盒子类的定义:代码见备注11/14/2022102.1.2 派生类的定义派生类的定义使用派生类定义:使用派生类定义:class CColorbox:class CColorbox:public CBoxpublic CBox /公有继承公有继承/新增的私有数据成员新增的私有数据成员public:public:void SetColor(int c)/void SetColor(int c)/新增的成员函数新增的成员函数 color=c;color=c;private:private:int color;int color;利用继
11、承机制产生类比第一种简单多了,但功能一样。派生类利用继承机制产生类比第一种简单多了,但功能一样。派生类CColorboxCColorbox公有继承公有继承CboxCbox类,它包括基类类,它包括基类CBoxCBox类的全部数据成员类的全部数据成员(lengthlength,widthwidth,heightheight)和成员函数()和成员函数(SetWidth SetWidth、SetHeighSetHeigh和和SetWidthSetWidth),但访问权限发生了变化。并且添加自己的新成员),但访问权限发生了变化。并且添加自己的新成员数据成员数据成员colorcolor和成员函数和成员函数
12、SetColor()SetColor()。11/14/2022112.1.3 派生类的生成派生类的生成仔细分析派生新类这个过程,实际是经历了以下步骤:仔细分析派生新类这个过程,实际是经历了以下步骤:首先首先继承基类的成员,不论是数据成员,还是成员函数,除构造继承基类的成员,不论是数据成员,还是成员函数,除构造函数与析构函数外全部接收,全部成为派生类的成员。函数与析构函数外全部接收,全部成为派生类的成员。第二步第二步是重写基类成员。当基类成员在派生类的应用中不合适时,是重写基类成员。当基类成员在派生类的应用中不合适时,可以对继承的成员加以重写。如果派生类声明了一个与基类成员可以对继承的成员加以重
13、写。如果派生类声明了一个与基类成员函数相同的成员函数时,派生类中的新成员则屏蔽了基类同名成函数相同的成员函数时,派生类中的新成员则屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖(Override)。)。第三步第三步定义新成员。新成员必须与基类成员不同名,是派生类自定义新成员。新成员必须与基类成员不同名,是派生类自己的新特性。派生类新成员的加入使得派生类在功能上有所发展。己的新特性。派生类新成员的加入使得派生类在功能上有所发展。这一步是继承与派生的核心特征。这一步是继承与派生的核心特征。第四步第四步是重写构造函数与析构函数。因
14、为派生类不继承基类的构是重写构造函数与析构函数。因为派生类不继承基类的构造函数与析构函数,并且派生类的需要对新添加的数据成员进行造函数与析构函数,并且派生类的需要对新添加的数据成员进行必要的初始化,所以构造函数与析构函数需要重写。必要的初始化,所以构造函数与析构函数需要重写。11/14/2022122.2 类的继承方式类的继承方式 派生类中包含基类的成员和派生类自己增加的成派生类中包含基类的成员和派生类自己增加的成员,那么这两部分的成员关系和访问权限该如何确定员,那么这两部分的成员关系和访问权限该如何确定呢?在继承机制中,并不是简单的把基类的私有成员呢?在继承机制中,并不是简单的把基类的私有成
15、员直接作为派生类的私有成员,把基类的公有成员直接直接作为派生类的私有成员,把基类的公有成员直接作为派生类的公有成员。派生类继承的基类成员访问作为派生类的公有成员。派生类继承的基类成员访问权限由继承方式来控制。权限由继承方式来控制。继承方式有三种:继承方式有三种:public(公有)继承(公有)继承、protected(保护)继承保护)继承和和private(私有)(私有)继承。不同的继承继承。不同的继承方式,决定了从基类继承来的成员的访问权限。下面方式,决定了从基类继承来的成员的访问权限。下面分别介绍不同继承方式下,派生类成员的访问权限。分别介绍不同继承方式下,派生类成员的访问权限。11/14
16、/2022132.2.1 公有继承公有继承当定义一个派生类时,将基类前的继承方式指定为当定义一个派生类时,将基类前的继承方式指定为public,则称为则称为公有派生(或公有继承)。公有派生(或公有继承)。采用公有继承方式时,基类采用公有继承方式时,基类的公有成员和保护成员的访问权限在派生类中不变。而基类的的公有成员和保护成员的访问权限在派生类中不变。而基类的私有成员在派生类中是不可访问。但它仍然是基类的私有成员,私有成员在派生类中是不可访问。但它仍然是基类的私有成员,如果需要在派生类中引用继承基类的私有成员,那么需要通过如果需要在派生类中引用继承基类的私有成员,那么需要通过基类的公有或保护的成
17、员函数访问。基类的公有或保护的成员函数访问。【例例2.3】演示公有继承方式下,不同成员的访问权限。程序代演示公有继承方式下,不同成员的访问权限。程序代码见备注:码见备注:11/14/2022142.2.1 公有继承公有继承【例例2.4】公有派生方式下如何访问继承的基类原有私有数据成公有派生方式下如何访问继承的基类原有私有数据成员。程序代码见备注:员。程序代码见备注:11/14/2022152.2.2 私有继承私有继承 当定义一个派生类时,将基类前的继承方式指定为当定义一个派生类时,将基类前的继承方式指定为privateprivate,则称为私有继承。则称为私有继承。用私有继承方式建立的派生类称
18、为私有派生类,用私有继承方式建立的派生类称为私有派生类,其基类成为私有基类。采用私有继承方式时,私有基类的公有成其基类成为私有基类。采用私有继承方式时,私有基类的公有成员和保护成员在私有派生类中成为私有成员。即派生类成员可访员和保护成员在私有派生类中成为私有成员。即派生类成员可访问它们,而派生类外不可访问它们。基类的私有成员在派生类中问它们,而派生类外不可访问它们。基类的私有成员在派生类中成为不可访问的成员。私有继承基类成员的访问权限如表成为不可访问的成员。私有继承基类成员的访问权限如表2-22-2所所示。私有继承的意义是将基类中原来能被外部访问的成员隐藏起示。私有继承的意义是将基类中原来能被
19、外部访问的成员隐藏起来,不让外界引用。来,不让外界引用。【例例2.5】私有继承演示。私有继承演示。11/14/2022162.2.2 私有继承私有继承由上例可以看到私有继承方式:由上例可以看到私有继承方式:(1 1)不能通过派生类对象()不能通过派生类对象(box1box1)引用从私有继承过来的任何)引用从私有继承过来的任何成员。如成员。如box1.set(3,5,6);box1.set(3,5,6);或或box1.length=100box1.length=100。(2 2)在派生类内部(如派生类的成员函数),不可以访问基类)在派生类内部(如派生类的成员函数),不可以访问基类的私有成员(如的
20、私有成员(如length=lenlength=len,lengthlength为基类的私有成员),但可为基类的私有成员),但可以访问基类的公有和保护成员(如以访问基类的公有和保护成员(如height=hheight=h,heightheight为基类的保为基类的保护成员)。护成员)。(3 3)如果派生类需要访问基类的私有成员,可以通过派生类的)如果派生类需要访问基类的私有成员,可以通过派生类的成员函数调用基类的公有成员函数实现如:成员函数调用基类的公有成员函数实现如:void set_1(double len,double w,double h,int c)void set_1(double
21、len,double w,double h,int c)set(len,w,h);/set(len,w,h);/基类的公有成员函数基类的公有成员函数 由上可以看出,私有派生的限制太多,一般不经常使用。由上可以看出,私有派生的限制太多,一般不经常使用。11/14/2022172.2.3 保护继承保护继承当定义一个派生类时,将基类前的继承方式指定为当定义一个派生类时,将基类前的继承方式指定为protectedprotected,则称为保护继承。则称为保护继承。在保护继承中,基类的公有成员和保护成员成在保护继承中,基类的公有成员和保护成员成为派生类的保护成员,在派生类中可以直接访问,但在派生类外为派
22、生类的保护成员,在派生类中可以直接访问,但在派生类外不能直接访问任何基类成员的。基类中的私有成员成为派生类的不能直接访问任何基类成员的。基类中的私有成员成为派生类的不可访问成员,在派生类中不可直接访问。保护继承基类成员的不可访问成员,在派生类中不可直接访问。保护继承基类成员的访问权限如表访问权限如表2-32-3所示。保护继承的意义是将基类的公有成员也所示。保护继承的意义是将基类的公有成员也保护起来,不让类外部任意访问。保护起来,不让类外部任意访问。11/14/202218继承的方式有三种,使用不同继承方式,基类的成员在派生类中继承的方式有三种,使用不同继承方式,基类的成员在派生类中的访问权限也
23、不同。不同继承方式下基类成员在派生类的访问权的访问权限也不同。不同继承方式下基类成员在派生类的访问权限总结如表限总结如表2-42-4所示。所示。2.2.4 继承方式的总结和比较继承方式的总结和比较11/14/2022192.3 派生类的构造函数与析构函数派生类的构造函数与析构函数 派生类的成员是由派生类的成员是由基类中的数据成员基类中的数据成员和和派生类中新增的数据派生类中新增的数据成员成员共同构成。而在继承机制下,构造函数不能够被继承。因此,共同构成。而在继承机制下,构造函数不能够被继承。因此,对继承过来的基类成员的初始化工作也得由派生类的构造函数完对继承过来的基类成员的初始化工作也得由派生
24、类的构造函数完成。也就是说在定义派生类的构造函数时,既要初始化派生类新成。也就是说在定义派生类的构造函数时,既要初始化派生类新增数据,又要初始化基类的成员。所以,在定义派生类的构造函增数据,又要初始化基类的成员。所以,在定义派生类的构造函数时,有两步需要做:数时,有两步需要做:编写代码完成自己的数据成员进行初始化编写代码完成自己的数据成员进行初始化调用基类构造函数使基类数据成员得以初始化。调用基类构造函数使基类数据成员得以初始化。11/14/2022202.3.1 简单派生类的构造函数简单派生类的构造函数 单一继承的构造函数的定义形式为:单一继承的构造函数的定义形式为:派生类名派生类名:派生类
25、构造函数名派生类构造函数名(参数总表参数总表):):基类构造函数名基类构造函数名 (参数名表参数名表)派生类新增成员的初始化语句派生类新增成员的初始化语句;定义派生类的构造函数时,在构造函数的参数总表中包括定义派生类的构造函数时,在构造函数的参数总表中包括基基类构造函数所需的参数和派生类新增的数据成员初始化所需的参类构造函数所需的参数和派生类新增的数据成员初始化所需的参数数。冒号后面基类构造函数名。冒号后面基类构造函数名 (参数名表参数名表),表示要调用基类的,表示要调用基类的构造函数。构造函数。【例例2.62.6】演示派生类的构造函数执行顺序。演示派生类的构造函数执行顺序。11/14/202
展开阅读全文