《(中职)编程语言基础------C++模块8教学课件.ppt》由会员分享,可在线阅读,更多相关《(中职)编程语言基础------C++模块8教学课件.ppt(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、YCF正版可修改PPT(中职)编程语言基础-C+模块8教学课件模块模块8继承与派生继承与派生任务任务1继承概述继承概述任务任务2派生类派生类任务任务3单继承单继承任务任务4多继承多继承任务任务5派生关系中的二义性派生关系中的二义性任务任务6虚基类虚基类返回任务任务1继承概述继承概述8.1.1 继承继承继承是现实世界普遍存在的现象。例如,子女会继承父母的特点,同继承是现实世界普遍存在的现象。例如,子女会继承父母的特点,同继承是现实世界普遍存在的现象。例如,子女会继承父母的特点,同继承是现实世界普遍存在的现象。例如,子女会继承父母的特点,同时又有自己的特点。对老产品进行改进形成新产品,新产品继承老
2、产时又有自己的特点。对老产品进行改进形成新产品,新产品继承老产时又有自己的特点。对老产品进行改进形成新产品,新产品继承老产时又有自己的特点。对老产品进行改进形成新产品,新产品继承老产品的一些特征,同时又有新的改进。继承也被用于程序设计中。通过品的一些特征,同时又有新的改进。继承也被用于程序设计中。通过品的一些特征,同时又有新的改进。继承也被用于程序设计中。通过品的一些特征,同时又有新的改进。继承也被用于程序设计中。通过继承可以在原有类的基础上建立新类,新类继承原有类的内容,使程继承可以在原有类的基础上建立新类,新类继承原有类的内容,使程继承可以在原有类的基础上建立新类,新类继承原有类的内容,使
3、程继承可以在原有类的基础上建立新类,新类继承原有类的内容,使程序代码可以重用,提高程序设计效率。序代码可以重用,提高程序设计效率。序代码可以重用,提高程序设计效率。序代码可以重用,提高程序设计效率。继承是一个进程,通过继承,一个对象可以获得另一个对象的属性。继承是一个进程,通过继承,一个对象可以获得另一个对象的属性。继承是一个进程,通过继承,一个对象可以获得另一个对象的属性。继承是一个进程,通过继承,一个对象可以获得另一个对象的属性。更严格地说,一个对象可以继承属性的集合,并可向其中加人属于自更严格地说,一个对象可以继承属性的集合,并可向其中加人属于自更严格地说,一个对象可以继承属性的集合,并
4、可向其中加人属于自更严格地说,一个对象可以继承属性的集合,并可向其中加人属于自己的一些特征。在己的一些特征。在己的一些特征。在己的一些特征。在C+C+语言中,继承是一个十分重要的概念,因为继语言中,继承是一个十分重要的概念,因为继语言中,继承是一个十分重要的概念,因为继语言中,继承是一个十分重要的概念,因为继承允许一个对象支持多层分类的概念。很多信息通过多层分类变得容承允许一个对象支持多层分类的概念。很多信息通过多层分类变得容承允许一个对象支持多层分类的概念。很多信息通过多层分类变得容承允许一个对象支持多层分类的概念。很多信息通过多层分类变得容易管理。易管理。易管理。易管理。)下一页返回任务任
5、务1继承概述继承概述例如例如例如例如:楼房是建筑物中的一部分,建筑物又是结构的一部分,结构又是楼房是建筑物中的一部分,建筑物又是结构的一部分,结构又是楼房是建筑物中的一部分,建筑物又是结构的一部分,结构又是楼房是建筑物中的一部分,建筑物又是结构的一部分,结构又是建造这一概念中的一部分。在这种情况下,子类继承了父类的所有属建造这一概念中的一部分。在这种情况下,子类继承了父类的所有属建造这一概念中的一部分。在这种情况下,子类继承了父类的所有属建造这一概念中的一部分。在这种情况下,子类继承了父类的所有属性,并加人了子类所特有的属性。如果不使用多层分类的概念,对每性,并加人了子类所特有的属性。如果不使
6、用多层分类的概念,对每性,并加人了子类所特有的属性。如果不使用多层分类的概念,对每性,并加人了子类所特有的属性。如果不使用多层分类的概念,对每个对象的清晰描述都要包括其全部属性。而采用继承来描述一个对象个对象的清晰描述都要包括其全部属性。而采用继承来描述一个对象个对象的清晰描述都要包括其全部属性。而采用继承来描述一个对象个对象的清晰描述都要包括其全部属性。而采用继承来描述一个对象时,只需在通用类特征的基础上添加该对象的一些特有属性即可。这时,只需在通用类特征的基础上添加该对象的一些特有属性即可。这时,只需在通用类特征的基础上添加该对象的一些特有属性即可。这时,只需在通用类特征的基础上添加该对象
7、的一些特有属性即可。这样一来,由继承得到的对象是惟一的,因此,继承在面向对象程序设样一来,由继承得到的对象是惟一的,因此,继承在面向对象程序设样一来,由继承得到的对象是惟一的,因此,继承在面向对象程序设样一来,由继承得到的对象是惟一的,因此,继承在面向对象程序设计中的作用十分重要。计中的作用十分重要。计中的作用十分重要。计中的作用十分重要。类的继承是类的继承是类的继承是类的继承是C+C+语言的一种重要机制,该机制自动为一个类提供来自语言的一种重要机制,该机制自动为一个类提供来自语言的一种重要机制,该机制自动为一个类提供来自语言的一种重要机制,该机制自动为一个类提供来自另一个类的操作和数据结构。
8、继承可以使程序设计人员在一个一般类另一个类的操作和数据结构。继承可以使程序设计人员在一个一般类另一个类的操作和数据结构。继承可以使程序设计人员在一个一般类另一个类的操作和数据结构。继承可以使程序设计人员在一个一般类的基础上很快建立一个新的类,而不必从零开始设计每个类。的基础上很快建立一个新的类,而不必从零开始设计每个类。的基础上很快建立一个新的类,而不必从零开始设计每个类。的基础上很快建立一个新的类,而不必从零开始设计每个类。)上一页 下一页返回任务任务1继承概述继承概述8.1.2 继承的相关说明继承的相关说明关于继承的几点说明。关于继承的几点说明。关于继承的几点说明。关于继承的几点说明。(1
9、)(1)如果子类继承了父类,则子类自动具有父类的全部数据成员如果子类继承了父类,则子类自动具有父类的全部数据成员如果子类继承了父类,则子类自动具有父类的全部数据成员如果子类继承了父类,则子类自动具有父类的全部数据成员(数数数数据结构据结构据结构据结构)和成员函数和成员函数和成员函数和成员函数(功能功能功能功能););但是,子类对父类的成员的访问有所限制。但是,子类对父类的成员的访问有所限制。但是,子类对父类的成员的访问有所限制。但是,子类对父类的成员的访问有所限制。(2)(2)子类可以定义自己的成员子类可以定义自己的成员子类可以定义自己的成员子类可以定义自己的成员:数据成员和成员函数。数据成员
10、和成员函数。数据成员和成员函数。数据成员和成员函数。(3)(3)基类、派生类或父类、子类都是相对的。一个类派生出的新的类基类、派生类或父类、子类都是相对的。一个类派生出的新的类基类、派生类或父类、子类都是相对的。一个类派生出的新的类基类、派生类或父类、子类都是相对的。一个类派生出的新的类就是派生类。派生类一也可以被其他类继承,这个派生类同时一也是就是派生类。派生类一也可以被其他类继承,这个派生类同时一也是就是派生类。派生类一也可以被其他类继承,这个派生类同时一也是就是派生类。派生类一也可以被其他类继承,这个派生类同时一也是基类。基类。基类。基类。继承类别包括公有继承、私有继承和保护继承。继承类
11、别包括公有继承、私有继承和保护继承。继承类别包括公有继承、私有继承和保护继承。继承类别包括公有继承、私有继承和保护继承。上一页 下一页返回任务任务1继承概述继承概述8.1.3 类的继承方式类的继承方式1.1.公有继承公有继承公有继承公有继承派生时用派生时用派生时用派生时用publicpublic作继承方式。作继承方式。作继承方式。作继承方式。基类的公有段基类的公有段基类的公有段基类的公有段(public)(public)成员被继承为公有的。成员被继承为公有的。成员被继承为公有的。成员被继承为公有的。基类的私有段基类的私有段基类的私有段基类的私有段(private)(private)成员在派生类
12、中不可见。成员在派生类中不可见。成员在派生类中不可见。成员在派生类中不可见。基类的保护段基类的保护段基类的保护段基类的保护段(protected)(protected)成员被继承为保护的。成员被继承为保护的。成员被继承为保护的。成员被继承为保护的。2.2.私有继承私有继承私有继承私有继承派生时用派生时用派生时用派生时用privateprivate作继承方式。作继承方式。作继承方式。作继承方式。基类的公有段基类的公有段基类的公有段基类的公有段(public)(public)成员被继承为私有的。成员被继承为私有的。成员被继承为私有的。成员被继承为私有的。基类的私有段基类的私有段基类的私有段基类的私
13、有段(private)(private)成员在派生类中不可见。成员在派生类中不可见。成员在派生类中不可见。成员在派生类中不可见。基类的保护段基类的保护段基类的保护段基类的保护段(protected)(protected)成员被继承为私有的。成员被继承为私有的。成员被继承为私有的。成员被继承为私有的。上一页 下一页返回任务任务1继承概述继承概述3.3.保护继承保护继承保护继承保护继承派生时用派生时用派生时用派生时用protectedprotected作继承方式。作继承方式。作继承方式。作继承方式。基类的公有段基类的公有段基类的公有段基类的公有段(public)(public)成员被继承为保护的。
14、成员被继承为保护的。成员被继承为保护的。成员被继承为保护的。基类的私有段基类的私有段基类的私有段基类的私有段(private)(private)成员在派生类中不可见。成员在派生类中不可见。成员在派生类中不可见。成员在派生类中不可见。基类的保护段基类的保护段基类的保护段基类的保护段(protected)(protected)成员被继承为保护的。成员被继承为保护的。成员被继承为保护的。成员被继承为保护的。注意以下几点。注意以下几点。注意以下几点。注意以下几点。)(1)(1)无论哪种继承方式,基类中的无论哪种继承方式,基类中的无论哪种继承方式,基类中的无论哪种继承方式,基类中的privatepriv
15、ate成员在派生类中都是不可见的。成员在派生类中都是不可见的。成员在派生类中都是不可见的。成员在派生类中都是不可见的。换句话说,基类中的换句话说,基类中的换句话说,基类中的换句话说,基类中的privateprivate成员不允许外部函数或派生类中的任何成成员不允许外部函数或派生类中的任何成成员不允许外部函数或派生类中的任何成成员不允许外部函数或派生类中的任何成员访问。员访问。员访问。员访问。上一页 下一页返回任务任务1继承概述继承概述(2 private(2 private派生确保基类中的方法只可以让派生类对象中的方法间接派生确保基类中的方法只可以让派生类对象中的方法间接派生确保基类中的方法只
16、可以让派生类对象中的方法间接派生确保基类中的方法只可以让派生类对象中的方法间接使用,而不能被外部使用。使用,而不能被外部使用。使用,而不能被外部使用。使用,而不能被外部使用。(3)public(3)public派生使得派生类对象和外部都可以直接使用基类中的方派生使得派生类对象和外部都可以直接使用基类中的方派生使得派生类对象和外部都可以直接使用基类中的方派生使得派生类对象和外部都可以直接使用基类中的方法,除非这些方法已被重新定义。法,除非这些方法已被重新定义。法,除非这些方法已被重新定义。法,除非这些方法已被重新定义。(4)protected(4)protected成员是一种血缘关系内外有别的成
17、员,它对派生对象成员是一种血缘关系内外有别的成员,它对派生对象成员是一种血缘关系内外有别的成员,它对派生对象成员是一种血缘关系内外有别的成员,它对派生对象来说,是公开成员,可以访问来说,是公开成员,可以访问来说,是公开成员,可以访问来说,是公开成员,可以访问;对血缘外部来讲,和对血缘外部来讲,和对血缘外部来讲,和对血缘外部来讲,和privateprivate成员一样成员一样成员一样成员一样被隐蔽。被隐蔽。被隐蔽。被隐蔽。上一页 下一页返回任务任务1继承概述继承概述 (5)private(5)private派生使得基类的非私有成员都成为派生类中的私有成员派生使得基类的非私有成员都成为派生类中的私
18、有成员派生使得基类的非私有成员都成为派生类中的私有成员派生使得基类的非私有成员都成为派生类中的私有成员;protected;protected派生使基类中的非私有成员的访问属性在派生类中都降为派生使基类中的非私有成员的访问属性在派生类中都降为派生使基类中的非私有成员的访问属性在派生类中都降为派生使基类中的非私有成员的访问属性在派生类中都降为保护的保护的保护的保护的publicpublic派生使得基类的非私有成员的访问属性在派生类中保持派生使得基类的非私有成员的访问属性在派生类中保持派生使得基类的非私有成员的访问属性在派生类中保持派生使得基类的非私有成员的访问属性在派生类中保持不变。不变。不变。
19、不变。不同继承方式的结果见不同继承方式的结果见不同继承方式的结果见不同继承方式的结果见表表表表8-18-1.上一页返回任务任务2派生类派生类8.2.1 派生类的定义派生类的定义 一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属
20、性,派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。一也就是说,类继承可以从一的类继承的实质就是建造新的派生类。一也就是说,类继承可以从一的类继承的实质就是建造新的派生类。一也就是说,类继承可以从一的类继承的实质就是建造新的派生类。一也就是说,类继承可以从一个类即基类中继承该基类的成员,并增加新的成员。个类即基
21、类中继承该基类的成员,并增加新的成员。个类即基类中继承该基类的成员,并增加新的成员。个类即基类中继承该基类的成员,并增加新的成员。继承其他类属性的类称为派生类,又称为子类。那么在原有类基础继承其他类属性的类称为派生类,又称为子类。那么在原有类基础继承其他类属性的类称为派生类,又称为子类。那么在原有类基础继承其他类属性的类称为派生类,又称为子类。那么在原有类基础上建立的新类也可以称之为派生类或子类,原有类称为子类的父类或上建立的新类也可以称之为派生类或子类,原有类称为子类的父类或上建立的新类也可以称之为派生类或子类,原有类称为子类的父类或上建立的新类也可以称之为派生类或子类,原有类称为子类的父类
22、或基类,一也可称为超类。子类和父类形成类的层次和继承关系。由于基类,一也可称为超类。子类和父类形成类的层次和继承关系。由于基类,一也可称为超类。子类和父类形成类的层次和继承关系。由于基类,一也可称为超类。子类和父类形成类的层次和继承关系。由于子类在父类的基础上建立,因此子类继承了父类的特性和功子类除了子类在父类的基础上建立,因此子类继承了父类的特性和功子类除了子类在父类的基础上建立,因此子类继承了父类的特性和功子类除了子类在父类的基础上建立,因此子类继承了父类的特性和功子类除了拥有父类的特性和功能外,还可以增加自己的特性和功能。拥有父类的特性和功能外,还可以增加自己的特性和功能。拥有父类的特性
23、和功能外,还可以增加自己的特性和功能。拥有父类的特性和功能外,还可以增加自己的特性和功能。下一页返回任务任务2派生类派生类C+C+中定义派生类的语法格式如下中定义派生类的语法格式如下中定义派生类的语法格式如下中定义派生类的语法格式如下:classclass:新增私有成员声明语句列表新增私有成员声明语句列表新增私有成员声明语句列表新增私有成员声明语句列表public:public:新增公有成员声明语句列表新增公有成员声明语句列表新增公有成员声明语句列表新增公有成员声明语句列表protected:protected:新增保护成员声明语句列表新增保护成员声明语句列表新增保护成员声明语句列表新增保护成
24、员声明语句列表;上一页 下一页返回任务任务2派生类派生类“继承方式继承方式继承方式继承方式”即派生类的访问控制方式,用于控制基类中声明的成员即派生类的访问控制方式,用于控制基类中声明的成员即派生类的访问控制方式,用于控制基类中声明的成员即派生类的访问控制方式,用于控制基类中声明的成员在多大的范围内能被派生类的用户访问。每一个继承方式,只对紧随在多大的范围内能被派生类的用户访问。每一个继承方式,只对紧随在多大的范围内能被派生类的用户访问。每一个继承方式,只对紧随在多大的范围内能被派生类的用户访问。每一个继承方式,只对紧随其后的基类进行限定。其后的基类进行限定。其后的基类进行限定。其后的基类进行限
25、定。继承方式包括继承方式包括继承方式包括继承方式包括3 3种种种种:公有继承公有继承公有继承公有继承public;public;私有继承私有继承私有继承私有继承private;private;保护继保护继保护继保护继承承承承protectedprotected。若不显式给出继承方式关键字,系统则默认为私有继承。若不显式给出继承方式关键字,系统则默认为私有继承。若不显式给出继承方式关键字,系统则默认为私有继承。若不显式给出继承方式关键字,系统则默认为私有继承(private(private。类的继承方式指定了派生类成员以及类外对象对于从基类。类的继承方式指定了派生类成员以及类外对象对于从基类。类
26、的继承方式指定了派生类成员以及类外对象对于从基类。类的继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。继承来的成员的访问权限。继承来的成员的访问权限。继承来的成员的访问权限。从己有类派生出的新类,除了能从基类继承所有成员之外,还可以从己有类派生出的新类,除了能从基类继承所有成员之外,还可以从己有类派生出的新类,除了能从基类继承所有成员之外,还可以从己有类派生出的新类,除了能从基类继承所有成员之外,还可以在派生类内完成以下几种功能。在派生类内完成以下几种功能。在派生类内完成以下几种功能。在派生类内完成以下几种功能。)上一页 下一页返回任务任务2派生类派生类 (1)(1)可以
27、增加新的数据成员。可以增加新的数据成员。可以增加新的数据成员。可以增加新的数据成员。(2)(2)可以增加新的成员函数。可以增加新的成员函数。可以增加新的成员函数。可以增加新的成员函数。(3)(3)可以重新定义基类中已有的成员函数。可以重新定义基类中已有的成员函数。可以重新定义基类中已有的成员函数。可以重新定义基类中已有的成员函数。(4)(4)可以改变现有成员的属性。可以改变现有成员的属性。可以改变现有成员的属性。可以改变现有成员的属性。继承方式决定了子类对父类的访问权限。有继承方式决定了子类对父类的访问权限。有继承方式决定了子类对父类的访问权限。有继承方式决定了子类对父类的访问权限。有3 3种
28、继承方式种继承方式种继承方式种继承方式:private:private,public,public和和和和protected,protected,默认为默认为默认为默认为private,private,最常用的是最常用的是最常用的是最常用的是publicpublic 为了理解为了理解为了理解为了理解G+G+如何根据已有类建立新类,请分析下面的程序。如何根据已有类建立新类,请分析下面的程序。如何根据已有类建立新类,请分析下面的程序。如何根据已有类建立新类,请分析下面的程序。上一页 下一页返回任务任务2派生类派生类上一页 下一页返回任务任务2派生类派生类 在类名在类名在类名在类名B B后后后后pu
29、blic Apublic A之前有一个冒号。冒号说明之前有一个冒号。冒号说明之前有一个冒号。冒号说明之前有一个冒号。冒号说明B B类根据类根据类根据类根据A A类建立,类建立,类建立,类建立,A A类是类是类是类是B B类的基类类的基类类的基类类的基类(直接基类直接基类直接基类直接基类),B),B类可以继承类可以继承类可以继承类可以继承A A类的内容。关键字类的内容。关键字类的内容。关键字类的内容。关键字publicpublic表表表表明,基类明,基类明,基类明,基类A A的所有公有成员一也是派生类的公有成员。但基类的所有公有成员一也是派生类的公有成员。但基类的所有公有成员一也是派生类的公有成
30、员。但基类的所有公有成员一也是派生类的公有成员。但基类A A的所的所的所的所有私有成员仍只属于有私有成员仍只属于有私有成员仍只属于有私有成员仍只属于A A类,不被派生类类,不被派生类类,不被派生类类,不被派生类B B继承。继承。继承。继承。一个类可以有直接基类和间接基类。如果类一个类可以有直接基类和间接基类。如果类一个类可以有直接基类和间接基类。如果类一个类可以有直接基类和间接基类。如果类A A派生出类派生出类派生出类派生出类B B,类,类,类,类B B又派又派又派又派生出类生出类生出类生出类C C,则称类,则称类,则称类,则称类A A是类是类是类是类B B的直接基类,类的直接基类,类的直接基
31、类,类的直接基类,类B B是类是类是类是类C C的直接基类,类的直接基类,类的直接基类,类的直接基类,类A A是是是是类类类类C C的间接基类。的间接基类。的间接基类。的间接基类。上一页 下一页返回任务任务2派生类派生类8.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数 派生类继承了基类的成员,实现了代码的复用。但是,基类的构造函派生类继承了基类的成员,实现了代码的复用。但是,基类的构造函派生类继承了基类的成员,实现了代码的复用。但是,基类的构造函派生类继承了基类的成员,实现了代码的复用。但是,基类的构造函数和析构函数不能被继承。在派生类中,如果对派生类新增成员进行数和析构函数不能
32、被继承。在派生类中,如果对派生类新增成员进行数和析构函数不能被继承。在派生类中,如果对派生类新增成员进行数和析构函数不能被继承。在派生类中,如果对派生类新增成员进行初始化,就必须由程序员针对实际需要加人新的构造函数。而且,对初始化,就必须由程序员针对实际需要加人新的构造函数。而且,对初始化,就必须由程序员针对实际需要加人新的构造函数。而且,对初始化,就必须由程序员针对实际需要加人新的构造函数。而且,对所有从基类继承下来的成员的初始化工作,还是由基类的构造函数完所有从基类继承下来的成员的初始化工作,还是由基类的构造函数完所有从基类继承下来的成员的初始化工作,还是由基类的构造函数完所有从基类继承下
33、来的成员的初始化工作,还是由基类的构造函数完成,但必须在派生类中,对基类的构造函数所需的参数进行设置。同成,但必须在派生类中,对基类的构造函数所需的参数进行设置。同成,但必须在派生类中,对基类的构造函数所需的参数进行设置。同成,但必须在派生类中,对基类的构造函数所需的参数进行设置。同样,对派生类对象的扫尾、清理工作也需要加人新的析构函数。样,对派生类对象的扫尾、清理工作也需要加人新的析构函数。样,对派生类对象的扫尾、清理工作也需要加人新的析构函数。样,对派生类对象的扫尾、清理工作也需要加人新的析构函数。上一页 下一页返回任务任务2派生类派生类 1.1.派生类的构造函数派生类的构造函数派生类的构
34、造函数派生类的构造函数 构造函数不能被继承,因此,派生类的构造函数必须通过调用基类构造函数不能被继承,因此,派生类的构造函数必须通过调用基类构造函数不能被继承,因此,派生类的构造函数必须通过调用基类构造函数不能被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时,的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时,的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时,的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时,除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数除了对自己的数据成员进行初始化外,还
35、必须负责调用基类构造函数除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。对子对象初始化的构造函数。对子对象初始化的构造函数。对子对象初始化的构造函数。上一页 下一页返回任务任务2派生类派生类派生类构造函数的一般语法规则为派生类构造函数的一般语法规则为派生类构造函
36、数的一般语法规则为派生类构造函数的一般语法规则为:():):()1),基类名基类名基类名基类名n()n),()1),(m(子对象参数表子对象参数表子对象参数表子对象参数表m)m)上一页 下一页返回任务任务2派生类派生类 派生类构造函数执行的一般次序如下派生类构造函数执行的一般次序如下派生类构造函数执行的一般次序如下派生类构造函数执行的一般次序如下:首先调用基类构造函数,调用首先调用基类构造函数,调用首先调用基类构造函数,调用首先调用基类构造函数,调用顺序按照它们被继承时说明的顺序。然后调用子对象的构造函数,调顺序按照它们被继承时说明的顺序。然后调用子对象的构造函数,调顺序按照它们被继承时说明的
37、顺序。然后调用子对象的构造函数,调顺序按照它们被继承时说明的顺序。然后调用子对象的构造函数,调用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。在实际应用中,使用派生类构造函数时应注意以下两个问题。在实际应用中,使用派生类构造函数时应注意以下两个问题。在实际应用中,使用派生类构造函数时应注意以下两个问题。在实际应用中,使用派生类构造函数时应注意以下两个问题。(1)(1)派生类构造函数的定义中可以省略
38、对基类构造函数的调用,其条派生类构造函数的定义中可以省略对基类构造函数的调用,其条派生类构造函数的定义中可以省略对基类构造函数的调用,其条派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当然,若基类中没有定义构造函数,派生类就不必负责调用基类构造函然,若基类中没有定义构造函数,派生类就不必负责调用基类构造函然,若基类中没有定义构造函数,派生类就不必负责
39、调用基类构造函然,若基类中没有定义构造函数,派生类就不必负责调用基类构造函数。数。数。数。(2)(2)当基类的构造函数使用一个或多个参数时,则派生类必须定义构当基类的构造函数使用一个或多个参数时,则派生类必须定义构当基类的构造函数使用一个或多个参数时,则派生类必须定义构当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。在某些情况下,派造函数,提供将参数传递给基类构造函数的途径。在某些情况下,派造函数,提供将参数传递给基类构造函数的途径。在某些情况下,派造函数,提供将参数传递给基类构造函数的途径。在某些情况下,派生类构造函数的参数可能为空,仅起到
40、传递参数的作用。生类构造函数的参数可能为空,仅起到传递参数的作用。生类构造函数的参数可能为空,仅起到传递参数的作用。生类构造函数的参数可能为空,仅起到传递参数的作用。上一页 下一页返回任务任务2派生类派生类 2.2.派生类的析构函数派生类的析构函数派生类的析构函数派生类的析构函数 当对象被删除时,派生类的析构函数就被执行。当对象被删除时,派生类的析构函数就被执行。当对象被删除时,派生类的析构函数就被执行。当对象被删除时,派生类的析构函数就被执行。由于析构函数不能被继承,因此在执行派生类的析构函数时,基类由于析构函数不能被继承,因此在执行派生类的析构函数时,基类由于析构函数不能被继承,因此在执行
41、派生类的析构函数时,基类由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。行基类的析构函数,其顺序与执行构造函数的顺序正好相反。行基类的析构函数,其顺序与执行构造函数的顺序正好相反。行基类的析构函数,其顺序与执行构造函数的顺序正好相反。上一页 下一页返回任务任务2派生类派生类上一页 下一页返回任务
42、任务2派生类派生类上一页 下一页返回任务任务2派生类派生类运行结果:运行结果:运行结果:运行结果:xyxy 在在在在C+C+中,由于析构函数不能被继承,因此在执行派生类的析构函数中,由于析构函数不能被继承,因此在执行派生类的析构函数中,由于析构函数不能被继承,因此在执行派生类的析构函数中,由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构
43、函数,其顺序与执行构造函数的顺序正好相反。数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。在此题的程序中,在主函数在此题的程序中,在主函数在此题的程序中,在主函数在此题的程序中,在主函数mainmain结束时,派生类结束时,派生类结束时,派生类结束时,派生类DerivedDerived对象对象对象对象ohjohj将被将被将被将被删除,所以就会调用对象的析构函数。先调用派生类的析构函数,输删除,所以就会调用对象的析构函数。先调用派生类的析构函数,输删除,所以就
44、会调用对象的析构函数。先调用派生类的析构函数,输删除,所以就会调用对象的析构函数。先调用派生类的析构函数,输出出出出x x,然后调用,然后调用,然后调用,然后调用基类的析构函数,输出基类的析构函数,输出基类的析构函数,输出基类的析构函数,输出Y Y。上一页 下一页返回任务任务2派生类派生类8.2.3基类与派生类之间的关系基类与派生类之间的关系 (1)(1)派生类不仅拥有属于自己的数据成员与成员函数,而且还保持了派生类不仅拥有属于自己的数据成员与成员函数,而且还保持了派生类不仅拥有属于自己的数据成员与成员函数,而且还保持了派生类不仅拥有属于自己的数据成员与成员函数,而且还保持了从基类继承来的数据
45、成员与成员函数。同时派生类可对一些继承来的从基类继承来的数据成员与成员函数。同时派生类可对一些继承来的从基类继承来的数据成员与成员函数。同时派生类可对一些继承来的从基类继承来的数据成员与成员函数。同时派生类可对一些继承来的函数重新定义,以适应新的要求。函数重新定义,以适应新的要求。函数重新定义,以适应新的要求。函数重新定义,以适应新的要求。(2)C+(2)C+中关于类的继承方式的规定,如中关于类的继承方式的规定,如中关于类的继承方式的规定,如中关于类的继承方式的规定,如表表表表8-28-2所示。所示。所示。所示。上一页 下一页返回任务任务2派生类派生类 按按按按privateprivate方式
46、继承方式继承方式继承方式继承(即私有继承即私有继承即私有继承即私有继承)时,基类中的公有成员和保护成员时,基类中的公有成员和保护成员时,基类中的公有成员和保护成员时,基类中的公有成员和保护成员在派生类中皆变为私有成员。在派生类中皆变为私有成员。在派生类中皆变为私有成员。在派生类中皆变为私有成员。按按按按publicpublic方式继承方式继承方式继承方式继承(即公有继承即公有继承即公有继承即公有继承)时,基类中的公有成员和保护成员时,基类中的公有成员和保护成员时,基类中的公有成员和保护成员时,基类中的公有成员和保护成员在派生类中不变。在派生类中不变。在派生类中不变。在派生类中不变。无论按哪种继
47、承方式继承,基类的私有成员在派生类中始终是不无论按哪种继承方式继承,基类的私有成员在派生类中始终是不无论按哪种继承方式继承,基类的私有成员在派生类中始终是不无论按哪种继承方式继承,基类的私有成员在派生类中始终是不可访问的。这与私有成员的定义是一致的,符合数据封装的思想。可访问的。这与私有成员的定义是一致的,符合数据封装的思想。可访问的。这与私有成员的定义是一致的,符合数据封装的思想。可访问的。这与私有成员的定义是一致的,符合数据封装的思想。注意注意注意注意:私有成员与不可访问成员是两个不同的概念。某个类的私有成私有成员与不可访问成员是两个不同的概念。某个类的私有成私有成员与不可访问成员是两个不
48、同的概念。某个类的私有成私有成员与不可访问成员是两个不同的概念。某个类的私有成员只能被该类的成员函数所访问,而类的不可访问成员甚至不能被该员只能被该类的成员函数所访问,而类的不可访问成员甚至不能被该员只能被该类的成员函数所访问,而类的不可访问成员甚至不能被该员只能被该类的成员函数所访问,而类的不可访问成员甚至不能被该类的成员函数所访问。类的不可访问成员总是从某个基类派生来的,类的成员函数所访问。类的不可访问成员总是从某个基类派生来的,类的成员函数所访问。类的不可访问成员总是从某个基类派生来的,类的成员函数所访问。类的不可访问成员总是从某个基类派生来的,它或者是基类的私有成员,或者是基类的不可访
49、问成员。它或者是基类的私有成员,或者是基类的不可访问成员。它或者是基类的私有成员,或者是基类的不可访问成员。它或者是基类的私有成员,或者是基类的不可访问成员。上一页 下一页返回任务任务2派生类派生类 (3)(3)在在在在C+C+中,可以根据需要定义多层的继承关系,一也可以从一个基中,可以根据需要定义多层的继承关系,一也可以从一个基中,可以根据需要定义多层的继承关系,一也可以从一个基中,可以根据需要定义多层的继承关系,一也可以从一个基类派生出多个类来形成类的层次结构,在类的层次结构中,处于高层类派生出多个类来形成类的层次结构,在类的层次结构中,处于高层类派生出多个类来形成类的层次结构,在类的层次
50、结构中,处于高层类派生出多个类来形成类的层次结构,在类的层次结构中,处于高层的类表示最一般的特征,而处于底层的类则表示更具体的特征。在多的类表示最一般的特征,而处于底层的类则表示更具体的特征。在多的类表示最一般的特征,而处于底层的类则表示更具体的特征。在多的类表示最一般的特征,而处于底层的类则表示更具体的特征。在多层继承关系中,基类与派生类的关系是相对的,例如层继承关系中,基类与派生类的关系是相对的,例如层继承关系中,基类与派生类的关系是相对的,例如层继承关系中,基类与派生类的关系是相对的,例如:由类由类由类由类A A派生出类派生出类派生出类派生出类B B,再由类,再由类,再由类,再由类B B