收藏 分销(赏)

151概述152类和对象153构造函数和析构函数154继承与派生省公共课一等奖全国赛课获奖课件.pptx

上传人:快乐****生活 文档编号:4153847 上传时间:2024-08-05 格式:PPTX 页数:61 大小:208.76KB
下载 相关 举报
151概述152类和对象153构造函数和析构函数154继承与派生省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共61页
151概述152类和对象153构造函数和析构函数154继承与派生省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共61页
151概述152类和对象153构造函数和析构函数154继承与派生省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共61页
151概述152类和对象153构造函数和析构函数154继承与派生省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共61页
151概述152类和对象153构造函数和析构函数154继承与派生省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、15.1概述概述15.2类和对象类和对象15.3结构函数和析构函数结构函数和析构函数15.4继承与派生继承与派生第15章 C+面向对象基础第1页15.1 概述概述C+不但扩充了不但扩充了C面向过程功效,而且增加了面向对面向过程功效,而且增加了面向对象功效,这就使象功效,这就使C+成为能适应面向对象程序设计成为能适应面向对象程序设计当代大型语言。当代大型语言。C+不是简单地对不是简单地对C做了一些改进,做了一些改进,而是在而是在C成功基础上进行了一场革命。赋予成功基础上进行了一场革命。赋予C以新以新生命力。生命力。客观世界中任何一个事物都能够看成一个对象。或客观世界中任何一个事物都能够看成一个对

2、象。或者说,客观世界是由千千万万个对象组成,它们之者说,客观世界是由千千万万个对象组成,它们之间经过一定渠道相互联络,如图间经过一定渠道相互联络,如图15.1示意。在实际示意。在实际生活中,人们往往在一个对象中进行活动,或者说生活中,人们往往在一个对象中进行活动,或者说对象是进行活动基本单位。作为对象,它应该最少对象是进行活动基本单位。作为对象,它应该最少有两个要素:一是从事活动主体;二是活动内容。有两个要素:一是从事活动主体;二是活动内容。要进行活动,或者是事先安排好一个活动计划,或要进行活动,或者是事先安排好一个活动计划,或者由外界暂时通知。者由外界暂时通知。第2页图图15.1 图图15.

3、2第3页从计算机角度看,一个对象应该包含两个要素:一从计算机角度看,一个对象应该包含两个要素:一是数据;二是需要进行操作。对象就是一个包含数是数据;二是需要进行操作。对象就是一个包含数据以及与这些数据相关操作集合。图据以及与这些数据相关操作集合。图15.2 表示一个表示一个对象是由数据和操作代码组成。对象是由数据和操作代码组成。传统面向过程程序设计是围绕功效进行,用一个函传统面向过程程序设计是围绕功效进行,用一个函数实现一个功效。全部数据都是公用,一个函数能数实现一个功效。全部数据都是公用,一个函数能够使用任意一组数据,而一组数据又能被多个函数够使用任意一组数据,而一组数据又能被多个函数所使用

4、(见图所使用(见图15.3)。程序设计者必须考虑每一个)。程序设计者必须考虑每一个细节,什么时候对什么数据进行操作。当程序规模细节,什么时候对什么数据进行操作。当程序规模较大、数据很多、操作种类繁多时,程序设计者往较大、数据很多、操作种类繁多时,程序设计者往往感到难以应付。往感到难以应付。第4页图图15.3第5页面向对象程序设计采取新思绪。它面正确是一个个面向对象程序设计采取新思绪。它面正确是一个个对象。全部数据分别属于不一样对象。实际上,每对象。全部数据分别属于不一样对象。实际上,每一组数据都是有特定用途,是某种操作对象。把相一组数据都是有特定用途,是某种操作对象。把相关数据和操作放在一起,

5、形成一个整体,与外界相关数据和操作放在一起,形成一个整体,与外界相对分隔。面向对象程序设计方法一个主要特点就是对分隔。面向对象程序设计方法一个主要特点就是“封装性封装性”,把数据和操作代码封装在一个对象,把数据和操作代码封装在一个对象中。程序设计者任务包含两个方面:一是设计对象,中。程序设计者任务包含两个方面:一是设计对象,即决定把哪些数据和操作封装在一起;二是在此基即决定把哪些数据和操作封装在一起;二是在此基础上怎样通知相关对象完成所需任务。这时他如同础上怎样通知相关对象完成所需任务。这时他如同一个总调度,不停地向各个对象发出命令,让这些一个总调度,不停地向各个对象发出命令,让这些对象活动起

6、来,完成自己范围内操作。各个对象操对象活动起来,完成自己范围内操作。各个对象操作完成了,整体任务也就完成了。显然,对一个大作完成了,整体任务也就完成了。显然,对一个大型任务来说,面向对象程序设计方法将是十分有效,型任务来说,面向对象程序设计方法将是十分有效,它能大大降低程序设计人员工作难度,降低犯错机它能大大降低程序设计人员工作难度,降低犯错机会。会。第6页15.2 类类 和和 对对 象象每一个实体都是对象。有一些对象是含有相同结构每一个实体都是对象。有一些对象是含有相同结构和特征。在和特征。在C+中对象类型称为中对象类型称为“类类”(class)。类代表了某一批对象共性和特征。能够说:类是对

7、类代表了某一批对象共性和特征。能够说:类是对象抽象,而对象是类详细实例。正如同结构体类型象抽象,而对象是类详细实例。正如同结构体类型和结构体变量关系一样,人们先申明一个结构体类和结构体变量关系一样,人们先申明一个结构体类型,然后用它去定义结构体变量。同一个结构体类型,然后用它去定义结构体变量。同一个结构体类型能够定义出多个不一样结构体变量。在型能够定义出多个不一样结构体变量。在C+中也中也是先申明一个是先申明一个“类类”类型,然后用它去定义若干个类型,然后用它去定义若干个同类型对象。对象就是一个同类型对象。对象就是一个“类类”类型变量。类是类型变量。类是用来定义对象一个抽象数据类型,或者说它是

8、产生用来定义对象一个抽象数据类型,或者说它是产生对象模板。它性质和其它数据类型(如整型、实型、对象模板。它性质和其它数据类型(如整型、实型、枚举类型、结构体类型)相同。在一开始时搞清对枚举类型、结构体类型)相同。在一开始时搞清对象和类关系是十分主要。象和类关系是十分主要。第7页C+对对C改进,最主要就是增加了改进,最主要就是增加了“类类”这么一个数这么一个数据类型。所以据类型。所以C+开始时被称为开始时被称为“带类带类C”。全部。全部面向对象语言都提供了这种数据类型。面向对象语言都提供了这种数据类型。在在C+中怎样申明一个中怎样申明一个“类类”类型呢?其方法和申类型呢?其方法和申明一个结构体类

9、型是相同。下面是我们已熟悉申明明一个结构体类型是相同。下面是我们已熟悉申明一个结构体类型:一个结构体类型:struct studentint num;char name10;char sex;struct student student1,student2;第8页上面申明了一个名为上面申明了一个名为student结构体类型并定义了两结构体类型并定义了两个结构体变量个结构体变量student1和和student2。能够看到它只。能够看到它只包含数据(变量),没有包含操作。假如希望对结包含数据(变量),没有包含操作。假如希望对结构体变量中各组员赋值或输出它们值,需要另外编构体变量中各组员赋值或输出

10、它们值,需要另外编写相关操作语句。结构体变量中各组员在本作用域写相关操作语句。结构体变量中各组员在本作用域中都是中都是“敞开敞开”,大家都能够用,而且不受任何限,大家都能够用,而且不受任何限制。这就造成程序不安全。现在我们申明一个类:制。这就造成程序不安全。现在我们申明一个类:class stud/以以class开头开头int num;char name10;char sex;/以上以上3行是数据组员行是数据组员 void display()/这是组员函数这是组员函数 coutnum:numendl;第9页 coutname:nameendl;coutsex:sexendl;/以上以上4行是操

11、作代码行是操作代码;stud stud1,stud2;/定义了两个定义了两个stud 类对象类对象 这就申明了一个名为这就申明了一个名为stud类。能够看到申明类。能够看到申明“类类”方方法是由申明结构体类型方法发展而来。它除了包含法是由申明结构体类型方法发展而来。它除了包含数据部分以外,还包含了对这些数据操作部分,也数据部分以外,还包含了对这些数据操作部分,也就是把数据和操作封装在一起。就是把数据和操作封装在一起。display是一个函是一个函数,用来输出本对象中学生学号、姓名和性别。类数,用来输出本对象中学生学号、姓名和性别。类除了含有封装性外,还采取了信息隐蔽标准,使类除了含有封装性外,

12、还采取了信息隐蔽标准,使类中组员与外界联络降低到最低程度。现在封装在中组员与外界联络降低到最低程度。现在封装在stud中组员都对外界隐蔽,外界不能调用它们。只中组员都对外界隐蔽,外界不能调用它们。只有本类中函数有本类中函数display能够调用同一类中数据。能够调用同一类中数据。第10页在本类中没有指定操作一律不能执行。这当然安全在本类中没有指定操作一律不能执行。这当然安全了,不过谁来通知执行了,不过谁来通知执行display函数呢?它无法开函数呢?它无法开启,缺乏对外界接口。所以,不能把全部组员与外启,缺乏对外界接口。所以,不能把全部组员与外界隔离,普通是把数据隐蔽起来,而把组员函数作界隔离

13、,普通是把数据隐蔽起来,而把组员函数作为对外界接口,譬如能够从外界发出一个命令,通为对外界接口,譬如能够从外界发出一个命令,通知该对象执行知该对象执行display函数,输出某一学生相关数函数,输出某一学生相关数据。据。类组员包含两大类,一类是类组员包含两大类,一类是“私有私有”(private),即,即外界不能调用;另一类是外界不能调用;另一类是“公用公用”(public),有,有书译为书译为“公有公有”,即公开,外界能够调用(稍后还,即公开,外界能够调用(稍后还要介绍一类即要介绍一类即“受保护受保护”(protected)。能够将上。能够将上面类申明改为面类申明改为第11页 class s

14、tud private:/申明以下部分为私有申明以下部分为私有 int num;char name10;char sex;public:/申明以下部分为公用申明以下部分为公用 void display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;/以上以上4行是操作代码行是操作代码;stud stud1,stud2;/定义了两个定义了两个stud 类对象类对象现在申明了现在申明了display函数是公用,外界就能够调用该函数是公用,外界就能够调用该函数了。函数了。第12页假如在类申明中既不指定假如在类申明中既不指定private,也不指

15、定,也不指定public,则系统就认为是私有(第一次类申明就属此情况)。则系统就认为是私有(第一次类申明就属此情况)。顺便介绍在面向对象程序设计中几个名词:类中组顺便介绍在面向对象程序设计中几个名词:类中组员函数称为员函数称为“方法方法”,“方法方法”是对数据是对数据操作操作。一个一个“方法方法”对应一个操作。显然,只有被申明为对应一个操作。显然,只有被申明为public方法(组员函数)才能被对象外界所激活。方法(组员函数)才能被对象外界所激活。外界是经过发外界是经过发“消息消息”来激活相关方法。所谓来激活相关方法。所谓“消消息息”,其实就是一个,其实就是一个命令命令,由程序语句来实现。比,由

16、程序语句来实现。比如想输出对象如想输出对象stud1中学生学号、姓名、性别等信中学生学号、姓名、性别等信息,能够在程序中写息,能够在程序中写stud1.display();这就是向对象这就是向对象stud1发出一个发出一个“消息消息”,通知它执行,通知它执行display“方法方法”(即(即display函数)。在这里一个语函数)。在这里一个语句中包括到句中包括到3个术语:对象、方法和消息。个术语:对象、方法和消息。第13页归纳以上对类型申明,能够得到其普通形式:归纳以上对类型申明,能够得到其普通形式:class 类名类名private:私有数据和组员函数私有数据和组员函数;public:公用

17、数据和组员函数公用数据和组员函数;C+增加了增加了class类型后,仍保留了结构体类型类型后,仍保留了结构体类型(struct)和共用体类型和共用体类型(union),而且把它们功效,而且把它们功效也扩展了,允许在申明结构体和共用体类型中包含也扩展了,允许在申明结构体和共用体类型中包含组员函数,也就是能够用组员函数,也就是能够用struct和和union来申明一个来申明一个类型。但它们和类型。但它们和class申明类有所区分。申明类有所区分。第14页用用struct申明类,假如不作申明类,假如不作private或或public申明,系申明,系统将其组员默认定为统将其组员默认定为public(公

18、用),在需要时能(公用),在需要时能够自己用显式申明重新指定为够自己用显式申明重新指定为private或或public。用用union申明类,假如不作申明类,假如不作private或或public申明,系申明,系统将其组员默认定为统将其组员默认定为public(公用),且不能改变。(公用),且不能改变。用用class申明类,假如不作申明类,假如不作private或或public申明,系统申明,系统将其组员默认定为将其组员默认定为private(私有),在需要时能(私有),在需要时能够自己用显式申明改变。够自己用显式申明改变。第15页15.3 结构函数和析构函数结构函数和析构函数15.3.1 结

19、构函数结构函数在建立一个对象时,经常需要作一些初始化工作在建立一个对象时,经常需要作一些初始化工作(比如对数据赋予初值),(比如对数据赋予初值),C+提供了一个特殊组提供了一个特殊组员函数员函数结构函数结构函数(constructor)。这种函数与。这种函数与其它组员不一样,不需要用户发其它组员不一样,不需要用户发“消息消息”来激活来激活它,而是在建立对象时自动执行。结构函数是由用它,而是在建立对象时自动执行。结构函数是由用户定义,它必须与类名同名,方便系统能识别它并户定义,它必须与类名同名,方便系统能识别它并把它作为结构函数。现在我们在前面申明类中加入把它作为结构函数。现在我们在前面申明类中

20、加入结构函数。结构函数。class stud private:/申明以下部分为私有申明以下部分为私有 int num;char name10;char sex;第16页public:stud()/定义结构函数,函数名与类名相同定义结构函数,函数名与类名相同 num=10010;strcpy(name,Wang-li);sex=F;/以上以上3行为给数据赋初值行为给数据赋初值 void display()/定义组员函数定义组员函数 coutnum:numendl;coutname:nameendl;coutsex:sexendl;stud stud1;/在定义对象在定义对象stud1时自动执行结

21、构函数时自动执行结构函数注意:注意:结构函数不需用户调用,而是在定义一个对象结构函数不需用户调用,而是在定义一个对象时由系统自动执行,而且只能执行一次。结构函数普时由系统自动执行,而且只能执行一次。结构函数普通申明为通申明为public,无返回值,也不需加,无返回值,也不需加void类型申明。类型申明。现在写成一个完整程序。现在写成一个完整程序。第17页例例15.1 建立一个对象,输出学生学号、姓名、性别。建立一个对象,输出学生学号、姓名、性别。#include#includevoid main()class stud /申明一个类申明一个类 private:/私有部分私有部分 int num

22、;char name10;char sex;public:/公用部分公用部分 stud()/定义结构函数,函数名与类名相同定义结构函数,函数名与类名相同 num=10010;/给数据赋初值给数据赋初值 strcpy(name,Wang-li);sex=F;void display()/定义组定义组员函数,输出对象数据员函数,输出对象数据第18页 coutnum:numendl;coutname:nameendl;coutsex:sexendl;stud stud1;/在定义对象在定义对象stud1时自动执行结构时自动执行结构函数函数stud1.display();/从对象外面调用从对象外面调用

23、display函数函数能够看到整个程序很简单,它包含三部分:能够看到整个程序很简单,它包含三部分:申明申明一个类;一个类;定义一个对象;定义一个对象;向对象发出消息,向对象发出消息,执行对象中组员函数执行对象中组员函数display。在定义。在定义stud1对象时对象时自动执行了结构函数自动执行了结构函数stud(),所以对象中数据组员,所以对象中数据组员均被赋了值。执行均被赋了值。执行display函数输出以下信息:函数输出以下信息:第19页num:10010name:Wang-lisex:F在程序中能够看到只有对象中函数才能引用本对象在程序中能够看到只有对象中函数才能引用本对象中数据。假如

24、在对象外面直接用中数据。假如在对象外面直接用coutstud1.num;企图输出学生学号是不行。由此可体会到类特点。企图输出学生学号是不行。由此可体会到类特点。假如要建立两个对象,分别对数据赋予初值,就不假如要建立两个对象,分别对数据赋予初值,就不能这么定义结构函数能这么定义结构函数stud了,因为它会使两个学生了,因为它会使两个学生初值相同,比如姓名都是初值相同,比如姓名都是Wang-li。应该分别赋予。应该分别赋予不一样初值。可将结构函数修改以下:不一样初值。可将结构函数修改以下:第20页stud(int n,char nam,char s)/定义结构函数,有形定义结构函数,有形参参 nu

25、m=n;strcpy(name,nam);sex=s;此时数据值不由结构函数此时数据值不由结构函数stud确定,而是在调用此函确定,而是在调用此函数时由实参传来。但应注意结构函数不一样于普通数时由实参传来。但应注意结构函数不一样于普通组员函数,不能这么调用:组员函数,不能这么调用:stud1.stud(10010,“Wang-li”,f);/企图用调用普通组企图用调用普通组员函数方法来调用结构函数员函数方法来调用结构函数前已说明结构函数是在建立对象时调用,所以实参前已说明结构函数是在建立对象时调用,所以实参应该在建立对象时给出。如:应该在建立对象时给出。如:stud stud1(10010,W

26、ang-li,f),stud2(10011,Zhang-fun,m);第21页现在定义了两个对象现在定义了两个对象stud1和和stud2,它们数据初值是,它们数据初值是不一样。假如想分别输出两个学生数据,能够用以不一样。假如想分别输出两个学生数据,能够用以下语句:下语句:stud1.display();stud2.display();此时输出以下:此时输出以下:num:10010name:Wang-lisex:fnum:10011name:Zhang-funsex:m用户也能够不定义结构函数,编译系统会自动生成用户也能够不定义结构函数,编译系统会自动生成一个结构函数,该函数没有参数,不进行任

27、何操作。一个结构函数,该函数没有参数,不进行任何操作。结构函数也能够重载,下面是两个重载函数:结构函数也能够重载,下面是两个重载函数:第22页stud()/在结构函数中对数据赋初值在结构函数中对数据赋初值 num=10010;strcpy(name,Wang-li);sex=F;stud(int n,char nam,char s)/有形参,由实有形参,由实参将值传给形参参将值传给形参 num=n;strcpy(name,nam);sex=s;在定义对象时允许有实参和无实参。如:在定义对象时允许有实参和无实参。如:stud stud1;/不带实参,数据初值在结构函数中不带实参,数据初值在结构函

28、数中指定指定stud stud2(10011,Zhang-fun,m);/带实参,数据带实参,数据初值由实参给出初值由实参给出第23页15.3.2 析构函数析构函数析构函数析构函数(destructor)与结构函数相反,当对象脱与结构函数相反,当对象脱离其作用域时(比如对象所在函数已调用完成),离其作用域时(比如对象所在函数已调用完成),系统自动执行析构函数。析构函数往往用来做系统自动执行析构函数。析构函数往往用来做“清清理善后理善后”工作(比如在建立对象时用工作(比如在建立对象时用new开辟了一开辟了一片内存空间,应在退出前在析构函数中用片内存空间,应在退出前在析构函数中用delete释释放

29、)。放)。析构函数名也应与类名相同,只是在函数名前面加析构函数名也应与类名相同,只是在函数名前面加一个波浪符一个波浪符,比如,比如stud(),以区分于结构函数。,以区分于结构函数。它不能带任何参数,也没有返回值(包含它不能带任何参数,也没有返回值(包含void类型)类型)。只能有一个析构函数,不能重载。假如用户没有。只能有一个析构函数,不能重载。假如用户没有编写析构函数,编译系统会自动生成一个缺省析构编写析构函数,编译系统会自动生成一个缺省析构函数,它也不进行任何操作。所以许多简单类中没函数,它也不进行任何操作。所以许多简单类中没有用显式析构函数。有用显式析构函数。第24页例例15.2 包含

30、结构函数和析构函数包含结构函数和析构函数C+程序。程序。#include#includeclass stud /申明一个类申明一个类 private:/私有部分私有部分 int num;char name10;char sex;public:/公用部分公用部分 stud(int n,char nam,char s)/结构函数结构函数 num=n;strcpy(name,nam);sex=s;stud()/析构函数析构函数 第25页 void display()/组员函数,输出对象数据组员函数,输出对象数据 coutnum:numendl;coutname:nameendl;coutsex:se

31、xendl;void main()stud stud1(10010,Wang-li,f),stud2(10011,Zhang-fun,m);/建立两个对象建立两个对象 stud1.display();/输出学生输出学生1数据数据 stud2.display();/输出学生输出学生2数据数据第26页现在把类申明放在现在把类申明放在main函数之前,它作用域是全局。函数之前,它作用域是全局。这么做能够使这么做能够使main函数更简练一些。在函数更简练一些。在main函数函数中定义了两个对象而且给出了初值。然后输出两个中定义了两个对象而且给出了初值。然后输出两个学生数据。运行结果和例学生数据。运行结

32、果和例15.1中给出相同。在本例中给出相同。在本例中,析构函数并无任何实质上作用,我们把它写出中,析构函数并无任何实质上作用,我们把它写出来,只是为了说明析构函数使用方法。来,只是为了说明析构函数使用方法。在本程序中,组员函数是在类中定义,假如组员函在本程序中,组员函数是在类中定义,假如组员函数数目很多以及函数长度很长,类申明就会占很大数数目很多以及函数长度很长,类申明就会占很大篇幅,不利于阅读程序。能够在类外面定义组员函篇幅,不利于阅读程序。能够在类外面定义组员函数,而在类中只用函数原型作申明。数,而在类中只用函数原型作申明。第27页例例15.3 在类外面定义组员函数。在类外面定义组员函数。

33、#include#includeclass stud/申明一个类申明一个类 private:int num;char name10;char sex;public:stud(int n,char nam,char s);/对结构函数原型申对结构函数原型申明明 stud();/对析构函数原型申明对析构函数原型申明 void display();/对组员函数对组员函数display原型申明原型申明;stud stud(int n,char nam,char s)/对结构函数对结构函数定义定义第28页 num=n;strcpy(name,nam);sex=s;stud stud()/对析构函数定义对

34、析构函数定义 void stud display()/对组员函数对组员函数display定义定义 coutnum:numendl;coutname:nameendl;coutsex:sexendl;void main()stud stud1(10010,Wang-li,f),stud2(10011,Zhang-fun,m);stud1.display();/输出学生输出学生1数据数据 stud2.display();/输出学生输出学生2数据数据 第29页请读者注意在类申明外部定义函数,必须指定类名。请读者注意在类申明外部定义函数,必须指定类名。函数首行形式为函数首行形式为函数类型函数类型 类名

35、类名 函数名(形参表列)函数名(形参表列)不能写成不能写成void display()/未指定类名未指定类名假如这么写,编译系统会把它作为普通函数处理,假如这么写,编译系统会把它作为普通函数处理,而不作为类中组员函数。也不要写成:而不作为类中组员函数。也不要写成:stud void display()/函数类型位置不函数类型位置不对对stud display()是一个整体,说明是是一个整体,说明是stud类中类中display函数。不能把函数。不能把stud 和和display()分隔开来。分隔开来。第30页即使函数在类外部定义,但在调用组员函数时会依即使函数在类外部定义,但在调用组员函数时会

36、依据类中函数原型申明找到函数定义(函数代码),据类中函数原型申明找到函数定义(函数代码),从而执行该函数。从而执行该函数。也能够将在类外部定义函数申明为也能够将在类外部定义函数申明为“内置函数内置函数”,这么在编译时就将函数代码代入到类中函数调用处,这么在编译时就将函数代码代入到类中函数调用处,以提升程序执行效率。只需在函数定义首行最左端以提升程序执行效率。只需在函数定义首行最左端加上加上inline即可。如:即可。如:inline void stud display()第31页15.4 继继 承承 与与 派派 生生15.4.1 继承与派生概念继承与派生概念面向对象技术强调软件可重用性。在面向

37、对象技术强调软件可重用性。在C+中可重用中可重用性是经过性是经过“继承继承”这一机制来实现。所以,继承这一机制来实现。所以,继承是是C+一主要组成部分。一主要组成部分。前面介绍了类,一个类中包含了若干数据组员和组前面介绍了类,一个类中包含了若干数据组员和组员函数。每一个类数据组员和组员函数是不相同。员函数。每一个类数据组员和组员函数是不相同。但有时两个类内容基本相同或有一部分相同。比如但有时两个类内容基本相同或有一部分相同。比如前面我们申明了学生基本数据类前面我们申明了学生基本数据类stud:第32页class studprivate:int num;char name10;char sex;

38、public:void display()/对组员函数对组员函数display定义定义 coutnum:numendl;coutname:nameendl;coutsex:sexendl;假如学校某部门除了需要用到学号、姓名、性别以假如学校某部门除了需要用到学号、姓名、性别以外,还需要用到年纪、地址等信息。当然能够重新外,还需要用到年纪、地址等信息。当然能够重新申明另一个类:申明另一个类:第33页class stud 1private:int num;/此行原来己有此行原来己有 char name10;/此行原来己有此行原来己有 char sex;/此行原来己有此行原来己有 int age;c

39、har addr20;public:void display();/此行原来己有此行原来己有 coutnum:numendl;/此行原来己有此行原来己有 coutname:nameendl;/此行原来己有此行原来己有 coutsex:sexendl;/此行原来己有此行原来己有 coutage:ageendl;coutaddress:addrendl;第34页能够看到有相当一部分是原来已经有。很多人自然能够看到有相当一部分是原来已经有。很多人自然会想到能否利用原有申明类作为基础,再加上新内会想到能否利用原有申明类作为基础,再加上新内容即可,以降低重复工作量。容即可,以降低重复工作量。C+提供提供

40、“继承继承”机制就是为了处理这个问题。机制就是为了处理这个问题。举一个日常生活中例子。假如已经定义了举一个日常生活中例子。假如已经定义了“马马”特特征,现在需要说明什么是征,现在需要说明什么是“公马公马”,只需在,只需在“马马”特征基础上增加特征基础上增加“雄性雄性”这一特征即可,无须从这一特征即可,无须从头说明什么是马。假如想深入说明什么是头说明什么是马。假如想深入说明什么是“白色公白色公马马”,只需在只需在“公马公马”基础上再增加说明基础上再增加说明“颜色颜色是白是白”即可。也就是说:即可。也就是说:“公马公马”继承了继承了“马马”全全部特征,加上部特征,加上“雄性雄性”新特征。新特征。“

41、白公马白公马”继承继承了了“公马公马”全部特征,再增加全部特征,再增加“白色白色”特征。而特征。而“公马公马”是是“马马”派生出来一个分支,派生出来一个分支,“白公马白公马”是是“公马公马”派生出来一个分支。见图派生出来一个分支。见图15.4示意。示意。第35页在在C+中所谓中所谓“继承继承”就是在一个已存在类基础上就是在一个已存在类基础上建立一个新类。已存在类(好比建立一个新类。已存在类(好比“马马”)称为)称为“基基类类”或或“父类父类”。新建立类称为。新建立类称为“派生类派生类”或或“子类子类”。见图见图15.5示意。示意。派生类继承了基类全部派生类继承了基类全部数据组员和组员函数,并增

42、加新组员。数据组员和组员函数,并增加新组员。图图15.4 图图15.5第36页15.4.2 建立派生类方法建立派生类方法先经过一个例子说明怎样经过继承来建立派生类。先经过一个例子说明怎样经过继承来建立派生类。例例15.4经过继承来建立派生类。经过继承来建立派生类。假设已经申明了一个基类假设已经申明了一个基类stud(见前面介绍),在此(见前面介绍),在此基础上申明一个派生类基础上申明一个派生类student:class student:public stud /申明基类是申明基类是stud private:int age;/新增加数据组员新增加数据组员 char addr30;/新增加数据组员

43、新增加数据组员 public:void display-1()/新增加组员函数新增加组员函数 coutage:ageendl;coutaddress:addrendl;第37页仔细观察第一行仔细观察第一行:class student:public stud 在在class后面后面student是新建类名。冒号后面是新建类名。冒号后面stud表示表示是已存在基类。在是已存在基类。在stud之前有一关键字之前有一关键字public,用,用来表示基类来表示基类stud中组员在派生类中组员在派生类student中使用权限。中使用权限。基类名前面有基类名前面有public称为称为“公用派生类公用派生类”

44、。其含义。其含义将在稍后讨论。将在稍后讨论。请仔细阅读以上申明派生类请仔细阅读以上申明派生类student和上一节中给出和上一节中给出基类基类stud,并将它们放在一起进行分析。,并将它们放在一起进行分析。定义派生类普通形式为定义派生类普通形式为第38页class 派生类名派生类名:引用权限引用权限 基类名基类名 派生类新增加数据组员派生类新增加数据组员 派生类新增加组员函数派生类新增加组员函数;“引用权限引用权限”能够是能够是private和和public。默认为。默认为private。派生类包含基类组员和自己增加组员,派生类组员派生类包含基类组员和自己增加组员,派生类组员函数在引用派生类自

45、己数据组员时,按前面介绍过函数在引用派生类自己数据组员时,按前面介绍过规则处理(即私有数据组员只能被同一类中组员函规则处理(即私有数据组员只能被同一类中组员函数引用,公用组员能够被外界引用)。而对从基类数引用,公用组员能够被外界引用)。而对从基类继承来组员引用并不是简单地把基类私有组员和公继承来组员引用并不是简单地把基类私有组员和公用组员直接作为派生类私有组员和公用组员,而要用组员直接作为派生类私有组员和公用组员,而要依据基类组员引用权限和派生类申明引用权限共同依据基类组员引用权限和派生类申明引用权限共同决定。下面将分别介绍。决定。下面将分别介绍。第39页15.4.3 公用派生类公用派生类在申

46、明一个派生类时将基类引用权限指定为在申明一个派生类时将基类引用权限指定为public,该类称为基类公用派生类。该类称为基类公用派生类。在公用派生类中,基类公用组员和保护在公用派生类中,基类公用组员和保护(protected)组员依然成为派生类中公用组员和保护组员组员依然成为派生类中公用组员和保护组员(关于关于保护组员将在保护组员将在15.4.5节介绍节介绍),而基类私有组员不能,而基类私有组员不能被派生类引用,即成为派生类被派生类引用,即成为派生类“不可访问组员不可访问组员”,只有基类组员函数能够引用它。基类组员在公用派只有基类组员函数能够引用它。基类组员在公用派生类中引用权限见表生类中引用权

47、限见表15.1。表表15.1 公用派生类继承关系公用派生类继承关系基类私有组员公用组员公用派生类不可访问组员公用组员第40页例例15.5 访问基类组员。访问基类组员。class stud /申明基类申明基类private:/基类私有组员基类私有组员 int num;char name10;char sex;public:/基类公用组员基类公用组员 void display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;class student:public stud /申明一个公用派生类申明一个公用派生类 第41页private:int

48、 age;char addr30;public:void show()coutnum:numendl;/企图引用基类私有组员,企图引用基类私有组员,错误。错误。coutname:nameendl;/企图引用基类私有组企图引用基类私有组员,错误。员,错误。coutsex:sexendl;/企图引用基类私有组员,企图引用基类私有组员,错误。错误。coutage:ageendl;/引用派生类私有组员,引用派生类私有组员,正确。正确。coutaddress:addrendl;/引用派生类私有组员,引用派生类私有组员,正确。正确。;第42页因为基类私有组员对派生类来说是不可访问,所以在派因为基类私有组员

49、对派生类来说是不可访问,所以在派生类中生类中show函数中直接引用基类私有数据组员函数中直接引用基类私有数据组员num,name和和sex是不允许。能够经过基类公用组员函数来是不允许。能够经过基类公用组员函数来引用基类私有数据组员。上面对派生类引用基类私有数据组员。上面对派生类student申明可申明可改为改为class student:public stud/申明一个公用派生类申明一个公用派生类 private:int age;char addr20;public:void show()display();/引用基类公用组员函数,允许。引用基类公用组员函数,允许。coutage:ageend

50、l;/引用派生类私有组员,引用派生类私有组员,正确。正确。coutaddress:addrendl;/引用派生类私有组员,正引用派生类私有组员,正确。确。;第43页在派生类组员函数在派生类组员函数show中引用基类公用组员函数中引用基类公用组员函数display,经过,经过display引用基类引用基类stud中私有数据中私有数据 num、name 和和sex。能够这么写。能够这么写main函数(假设对函数(假设对象象a中已经有数据):中已经有数据):void main()student a;/定义一个定义一个student派生类对象派生类对象a a.show();/输出输出a对象对象5个数据

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服