编程语言基础——c++教学课件作者刘炳松模块8

上传人:w****i 文档编号:102834380 上传时间:2019-10-04 格式:PPT 页数:94 大小:1.36MB
返回 下载 相关 举报
编程语言基础——c++教学课件作者刘炳松模块8_第1页
第1页 / 共94页
编程语言基础——c++教学课件作者刘炳松模块8_第2页
第2页 / 共94页
编程语言基础——c++教学课件作者刘炳松模块8_第3页
第3页 / 共94页
编程语言基础——c++教学课件作者刘炳松模块8_第4页
第4页 / 共94页
编程语言基础——c++教学课件作者刘炳松模块8_第5页
第5页 / 共94页
点击查看更多>>
资源描述

《编程语言基础——c++教学课件作者刘炳松模块8》由会员分享,可在线阅读,更多相关《编程语言基础——c++教学课件作者刘炳松模块8(94页珍藏版)》请在金锄头文库上搜索。

1、模块8继承与派生,任务1继承概述 任务2派生类 任务3单继承 任务4多继承 任务5派生关系中的二义性 任务6虚基类,返回,任务1继承概述,8.1.1 继承 继承是现实世界普遍存在的现象。例如,子女会继承父母的特点,同时又有自己的特点。对老产品进行改进形成新产品,新产品继承老产品的一些特征,同时又有新的改进。继承也被用于程序设计中。通过继承可以在原有类的基础上建立新类,新类继承原有类的内容,使程序代码可以重用,提高程序设计效率。 继承是一个进程,通过继承,一个对象可以获得另一个对象的属性。更严格地说,一个对象可以继承属性的集合,并可向其中加人属于自己的一些特征。在C+语言中,继承是一个十分重要的

2、概念,因为继承允许一个对象支持多层分类的概念。很多信息通过多层分类变得容易管理。),下一页,返回,任务1继承概述,例如:楼房是建筑物中的一部分,建筑物又是结构的一部分,结构又是建造这一概念中的一部分。在这种情况下,子类继承了父类的所有属性,并加人了子类所特有的属性。如果不使用多层分类的概念,对每个对象的清晰描述都要包括其全部属性。而采用继承来描述一个对象时,只需在通用类特征的基础上添加该对象的一些特有属性即可。这样一来,由继承得到的对象是惟一的,因此,继承在面向对象程序设计中的作用十分重要。 类的继承是C+语言的一种重要机制,该机制自动为一个类提供来自另一个类的操作和数据结构。继承可以使程序设

3、计人员在一个一般类的基础上很快建立一个新的类,而不必从零开始设计每个类。),上一页,下一页,返回,任务1继承概述,8. 1 .2 继承的相关说明 关于继承的几点说明。 (1)如果子类继承了父类,则子类自动具有父类的全部数据成员(数据结构)和成员函数(功能);但是,子类对父类的成员的访问有所限制。 (2)子类可以定义自己的成员:数据成员和成员函数。 (3)基类、派生类或父类、子类都是相对的。一个类派生出的新的类就是派生类。派生类一也可以被其他类继承,这个派生类同时一也是基类。 继承类别包括公有继承、私有继承和保护继承。,上一页,下一页,返回,任务1继承概述,8. 1 .3 类的继承方式 1.公有

4、继承 派生时用public作继承方式。 基类的公有段(public)成员被继承为公有的。 基类的私有段(private)成员在派生类中不可见。 基类的保护段(protected)成员被继承为保护的。 2.私有继承 派生时用private作继承方式。 基类的公有段(public)成员被继承为私有的。 基类的私有段(private)成员在派生类中不可见。 基类的保护段(protected)成员被继承为私有的。,上一页,下一页,返回,任务1继承概述,3.保护继承 派生时用protected作继承方式。 基类的公有段(public)成员被继承为保护的。 基类的私有段(private)成员在派生类中不可

5、见。 基类的保护段(protected)成员被继承为保护的。 注意以下几点。) (1)无论哪种继承方式,基类中的private成员在派生类中都是不可见的。换句话说,基类中的private成员不允许外部函数或派生类中的任何成员访问。,上一页,下一页,返回,任务1继承概述,( 2 private派生确保基类中的方法只可以让派生类对象中的方法间接使用,而不能被外部使用。 ( 3 ) public派生使得派生类对象和外部都可以直接使用基类中的方法,除非这些方法已被重新定义。 ( 4 ) protected成员是一种血缘关系内外有别的成员,它对派生对象来说,是公开成员,可以访问;对血缘外部来讲,和pri

6、vate成员一样被隐蔽。,上一页,下一页,返回,任务1继承概述,( 5 ) private派生使得基类的非私有成员都成为派生类中的私有成员;protected派生使基类中的非私有成员的访问属性在派生类中都降为保护的public派生使得基类的非私有成员的访问属性在派生类中保持不变。 不同继承方式的结果见表8-1.,上一页,返回,任务2派生类,8. 2.1 派生类的定义 一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。一也就是说,类

7、继承可以从一个类即基类中继承该基类的成员,并增加新的成员。 继承其他类属性的类称为派生类,又称为子类。那么在原有类基础上建立的新类也可以称之为派生类或子类,原有类称为子类的父类或基类,一也可称为超类。子类和父类形成类的层次和继承关系。由于子类在父类的基础上建立,因此子类继承了父类的特性和功子类除了拥有父类的特性和功能外,还可以增加自己的特性和功能。,下一页,返回,任务2派生类,C+中定义派生类的语法格式如下: class: 新增私有成员声明语句列表 public: 新增公有成员声明语句列表 protected: 新增保护成员声明语句列表 ;,上一页,下一页,返回,任务2派生类,“继承方式”即派

8、生类的访问控制方式,用于控制基类中声明的成员在多大的范围内能被派生类的用户访问。每一个继承方式,只对紧随其后的基类进行限定。 继承方式包括3种:公有继承public ;私有继承private ;保护继承protected。若不显式给出继承方式关键字,系统则默认为私有继承(private。类的继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。 从己有类派生出的新类,除了能从基类继承所有成员之外,还可以在派生类内完成以下几种功能。),上一页,下一页,返回,任务2派生类,(1)可以增加新的数据成员。 (2)可以增加新的成员函数。 (3)可以重新定义基类中已有的成员函数。 (4)可

9、以改变现有成员的属性。 继承方式决定了子类对父类的访问权限。有3种继承方式:private ,public和protected ,默认为private ,最常用的是public 为了理解G+如何根据已有类建立新类,请分析下面的程序。,上一页,下一页,返回,任务2派生类,上一页,下一页,返回,任务2派生类,在类名B后public A之前有一个冒号。冒号说明B类根据A类建立,A类是B类的基类(直接基类),B类可以继承A类的内容。关键字public表明,基类A的所有公有成员一也是派生类的公有成员。但基类A的所有私有成员仍只属于A类,不被派生类B继承。 一个类可以有直接基类和间接基类。如果类A派生出类

10、B,类B又派生出类C,则称类A是类B的直接基类,类B是类C的直接基类,类A是类C的间接基类。,上一页,下一页,返回,任务2派生类,8.2.2派生类的构造函数和析构函数 派生类继承了基类的成员,实现了代码的复用。但是,基类的构造函数和析构函数不能被继承。在派生类中,如果对派生类新增成员进行初始化,就必须由程序员针对实际需要加人新的构造函数。而且,对所有从基类继承下来的成员的初始化工作,还是由基类的构造函数完成,但必须在派生类中,对基类的构造函数所需的参数进行设置。同样,对派生类对象的扫尾、清理工作也需要加人新的析构函数。,上一页,下一页,返回,任务2派生类,1.派生类的构造函数 构造函数不能被继

11、承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时,除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。,上一页,下一页,返回,任务2派生类,派生类构造函数的一般语法规则为: :():(), 基类名n(),(),(子对象参数表m) ,上一页,下一页,返回,任务2派生类,派生类构造函数执行的一般次序如下:首先调用基类构造函数,调用顺序按照它们被继承时说明的顺序。然后调用子对象的构造函数,调用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。

12、在实际应用中,使用派生类构造函数时应注意以下两个问题。 (1)派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当然,若基类中没有定义构造函数,派生类就不必负责调用基类构造函数。 (2)当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。在某些情况下,派生类构造函数的参数可能为空,仅起到传递参数的作用。,上一页,下一页,返回,任务2派生类,2.派生类的析构函数 当对象被删除时,派生类的析构函数就被执行。 由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。

13、执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。,上一页,下一页,返回,任务2派生类,上一页,下一页,返回,任务2派生类,上一页,下一页,返回,任务2派生类,运行结果: xy 在C+中,由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。在此题的程序中,在主函数main结束时,派生类Derived对象ohj将被删除,所以就会调用对象的析构函数。先调用派生类的析构函数,输出x,然后调用 基类的析构函数,输出Y 。,上一页,下一页,返回

14、,任务2派生类,8.2.3基类与派生类之间的关系 (1)派生类不仅拥有属于自己的数据成员与成员函数,而且还保持了从基类继承来的数据成员与成员函数。同时派生类可对一些继承来的函数重新定义,以适应新的要求。 (2) C+中关于类的继承方式的规定,如表8-2所示。,上一页,下一页,返回,任务2派生类,按private方式继承(即私有继承)时,基类中的公有成员和保护成员在派生类中皆变为私有成员。 按public方式继承(即公有继承)时,基类中的公有成员和保护成员在派生类中不变。 无论按哪种继承方式继承,基类的私有成员在派生类中始终是不可访问的。这与私有成员的定义是一致的,符合数据封装的思想。 注意:私

15、有成员与不可访问成员是两个不同的概念。某个类的私有成员只能被该类的成员函数所访问,而类的不可访问成员甚至不能被该类的成员函数所访问。类的不可访问成员总是从某个基类派生来的,它或者是基类的私有成员,或者是基类的不可访问成员。,上一页,下一页,返回,任务2派生类,(3)在C+中,可以根据需要定义多层的继承关系,一也可以从一个基类派生出多个类来形成类的层次结构,在类的层次结构中,处于高层的类表示最一般的特征,而处于底层的类则表示更具体的特征。在多层继承关系中,基类与派生类的关系是相对的,例如:由类A派生出类B,再由类B派生出类C。这里,类B相对于类A是派生类,而相对于类C则是基类,并称类C是类A的间

16、接派生类,称类A是类C的间接基类,而称具有直接派生关系的两个类分别为直接派生类和直接基类。),上一页,下一页,返回,任务2派生类,【例8-1】类Build_1是一个关于楼房数据的类。它的数据成员有posi_x , posi_y和area,分别是楼房位置的经、纬度和建筑面积。它的函数成员只有setl,用于设置数据成员posi_ x , posi_y和area的值。让Build_ 1作为基类,再增加数据成员hi蜘、函数成员set2和disp来定义派生类Build_2。,上一页,下一页,返回,任务2派生类,上一页,下一页,返回,任务2派生类,上一页,下一页,返回,任务2派生类,运行结果: 经度:100 纬度:200 高度:400 面积:300,上一页,下一页,返回,任务2派生类,由此可见,派生类Build一中继承了基类Build_ 1中的数据成员posi_x , posi_v , area(它们都是基类Build_ 1中的protected成员)和基类中的成员函数setl(它是基类的public;成员),并同时增加了新的成员heigh

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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