§56第8章继承和派生

上传人:w****i 文档编号:92277538 上传时间:2019-07-08 格式:PPT 页数:37 大小:255.50KB
返回 下载 相关 举报
§56第8章继承和派生_第1页
第1页 / 共37页
§56第8章继承和派生_第2页
第2页 / 共37页
§56第8章继承和派生_第3页
第3页 / 共37页
§56第8章继承和派生_第4页
第4页 / 共37页
§56第8章继承和派生_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《§56第8章继承和派生》由会员分享,可在线阅读,更多相关《§56第8章继承和派生(37页珍藏版)》请在金锄头文库上搜索。

1、第8章 继承和派生,在C+中可重用性是通过继承(inheritance)这一机制来实现的。继承是C+的一个重要组成部分。,8.1 继承和派生的概念,在C+中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的父类那里获得父类的特性。从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。,8.1.1基类与派生类,1.继承与派生,已存在的类(例如“交通工具”)称为“基类”或“父类”。新建立的类(例如“飞机”)称为“派生类”或“子类”。,一个基类可以派

2、生出多个派生类,每一个派生类又可以作 为基类再派生出新的派生类,因此基类和派生类是相对 而言的。,2.基类与派生类,请注意图中箭头的方向,在本书中约定,箭头表示继承的方向,从派生类指向基类。,8.1.2继承与派生的作用,1.避免公用代码的重复开发,在减少代码和数据冗余的同时, 节省程序开发的时间,提高程序开发的效率和质量。 2.通过增强代码一致性来减少模块间的接口和界面。 3.通过层次关系来组织对象,使得高层类作为低层类的抽象, 有利于程序员掌握对象的共性,在此基础上,就能更快地掌握低层 类中的个性特征,给编程与代码重用带来方便。,8.1.3派生类的声明,声明一个派生类的一般格式为: clas

3、s 派生类名 : 派生存取说明符(可省) 基类名 /派生类新增的数据成员和成员函数 ;,派生类名”是要从基类派生出的新类的名字,“基类名”是一个 已经定义好的基类的名字,“派生存取说明符”可以是关键字 public或protected或private,派生存取说明符的作用会在后面 详细介绍,“派生存取说明符”可以省略,默认为private, 即私有派生。,/定义一个基类(Student类) class Student public: char name10; /姓名 int age; /年龄 char sex; /性别 char classname20; /班级名称 ; /定义一个派生类(Gr

4、aduateStudent类) class GraduateStudent : public Student public: char Advisorname10; /导师 int qualifiergrade; /资格考试分 ;,8.2 派生类成员的访问控制,8.2.1派生类成员访问控制简介,从一个基类派生出一个子类时,可以通过指定派生时的存取 说明符来实现对派生类成员的访问控制。,既然派生类中包含基类成员和派生类自己增加的成员,就产生了这两部分成员的关系和访问属性的问题。在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员。实际

5、上,对基类成员和派生类自己增加的成员是按不同的原则处理的。,8.2.2 private、protected与public类成员,1.private类成员,一个类中的私有(private)成员(包括数据成员和成员函数) 只能被它们所在类的成员函数和友元函数访问,在C+中类成员 存取说明符缺省的情况下的存取特征都是私有的(private)。,【例8.1】 类私有成员的定义和访问 #include using namespace std; class Person /Person类的三个私有成员 char name10; /姓名 private: int age; /年龄 char sex; /性别

6、 ; main() Person P1; P1.age=20; /非法 coutP1.nameendl; /非法 return 0; ,2.public类成员,一个类中的公有(public)成员(包括数据成员和成员函数) 可以被程序中任何代码(包括函数)访问,一般情况下,应尽 量将类的数据成员声明为私有(private),然后为需要被类外 部访问的数据成员提供公有的成员函数,实现对私有成员的设 置和访问,这种结构能够向类的客户很好的隐藏实现方法,在 有效减少错误的同时,可以增强程序的可修改性。,3.protected类成员,使用protected声明的称为保护成员。任何一个类的保护成员 仅可以

7、被其自己和派生类的所有非静态成员函数和友元函数直 接访问,也就是说其他的外部函数是不能访问它的。因此,对 于那些既要对外界隐藏,又要能被派生类访问的成员,可以将 它们声明为保护成员。,如果基类声明了私有成员,那么任何派生类都是不能访问它 们的,若希望在派生类中能访问它们,应当把它们声明为保 护成员。如果在一个类中声明了保护成员,就意味着该类可 能要用作基类,在它的派生类中会访问这些成员。,8.2.3三种派生方式的定义,1.私有(private)派生,在声明一个派生类时将派生方式指定为private的,称为私有派生, 用私有派生方式建立的派生类称为私有派生类 ,其基类称为私有 基类。,由私有派生

8、得到的派生类,它从基类继承的成员都将变为私有 成员,也就是说通过私有派生,派生类从基类继承来的公有成 员和保护成员都将变成派生类的私有成员,这些成员将只能被 派生类的成员函数和友元函数访问。需要重点说明的是,基类 的私有成员经过私有派生后继续保持其基类的私有成员身份, 无法被派生类访问。,2.保护(protected)派生,由保护派生得到的派生类,它从基类继承的公有和保护成员都 将变为派生类的保护成员。基类的私有成员经过保护派生后继 续保持其基类的私有成员身份,依然无法被派生类访问。,保护派生的特点是: 基类的公用成员和保护成员在派生 类中都成了保护成员,其私有成员仍为基类私有。也就是把 基类

9、原有的公用成员也保护起来,不让类外任意访问。,3.公有(public)派生,由公有派生得到的派生类,它从基类继承的成员都将维持原有访问控制特征,即通过公有派生后,派生类从基类继承的公有成员在派生类中仍然是公有成员,保护成员仍然是保护成员,而基类的私有成员经过公有派生后继续保持其基类的私有成员身份,依然无法被派生类访问。,8.2.4派生类成员访问控制规则,1.派生类中新增成员的访问控制遵循类成员访问控制的规则。,2. 类成员在派生类中的访问控制规则,注意:不管是何种派生,基类的private成员永远都不 能被其派生类直接访问,但可以通过基类的public和 protected成员函数访问。,8.

10、3 派生类的构造函数和析构函数,8.3.1派生类的构造函数和析构函数的声明,类的构造函数是类的一种特殊的成员函数,它的作用主要 是为对象分配内存、进行初始化;而析构函数它的作用与 构造函数相反。,派生类的构造函数声明格式如下 : 派生类的构造函数名称(参数表): 基类的构造函数名(参数表) / /派生类构造函数体 ,class Point int x,y; public: Point(int a,int b) /基类的构造函数 x=a; y=b; cout”Constructing Point class n”; Point() /基类的析构函数 cout”Destructing Point

11、class n”; ; class Circle :public Point double radius; public : Circle (double r,int a,int b):Point(a,b)/派生类的构造函数 radius =r; cout”Constructing Circle class n”; Circle () /派生类的析构函数 cout”Destructing Circle class n”; ;,派生类中含有对象成员时,其构造函数的声明格式如下:,派生类的构造函数名称(参数表): 基类的构造函数名(参数表), 对象成员名1(参数表),对象成员名N(参数表) / /

12、派生类构造函数体 ,class Circle2 :public Point double radius; Point P1; public : Circle2 (double r,int a,int b):Point(a,b),P1(a,b) /派生类的构造函数,定义时 /指定了基类的构造函数和对象成员P1的构造函数 radius =r; cout”Constructing Circle2 class n”; Circle2 () /派生类的析构函数 cout”Destructing Circle2 class n”; ;,8.3.2派生类的构造函数和析构函数的构造规则,1. 基类具有显式的构

13、造函数时,(1)基类具有不带参数的构造函数,派生类既可以自己不定义构造函数,也可以根据需要定义自己 的构造函数,构造函数可以带参数也可以省略,在派生类中定 义构造函数时还可省略“:基类构造函数名(参数表)”。,(2)基类仅有带参数的构造函数,派生类必须显式的定义其构造函数,并在声明时指定其基类的某 一构造函数和参数表,把参数传递给基类构造函数。,2. 基类具有隐式的构造函数时,当基类没有显式的定义(即隐式的定义)构造函数时,派生类 可以根据需要定义自己的构造函数,派生类构造函数的参数表、 基类的构造函数名和参数表都可以根据需要省略。,8.3.3派生类构造函数和析构函数的调用顺序,1. 构造函数

14、的调用顺序,派生类对象创建的时候,构造函数的执行顺序为:,(1)基类的构造函数 (2)对象成员的构造函数 (3)派生类自身的构造函数,2. 析构函数的调用顺序与构造函数的调用顺序正好相反。即,(1)派生类自身的析构函数 (2)对象成员的构造函数 (3)基类的析构函数,【例8.6】派生类Circle2的构造函数和析构函数的执行顺序 /Point和Circle2类的定义 main() Circle2 C1(0.0,1,1); cout”-program line- n”; return 0; ,程序的执行结果如下: Constructing Point class Constructing Poi

15、nt class Constructing Circle2 class -program line- Destructing Circle2 class Destructing Point class Destructing Point class,8.4 多重继承,8.4.1多重继承的声明,前面讨论的是单继承,即一个类是从一个基类派生而来的。在 C+中还允许从多个基类中派生出新的子类,这种派生方法称 为多重继承(或多基派生)。这一强大的派生功能可以大大提 高软件重用的灵活性 。,声明的格式如下:,class 派生类名 : 派生存取说明符(可省)1 基类名1, 派生存取说明符N 基类名N /派生类新增的数据成员和成员函数 ;,【例8.7】 多重继承的声明 #include using namespace std; class Circle1 /基类Circle1 protected: int r; public: void setx (int x) r=x; void draw( ) cout“drawingn“; ; class Circle2 /基类Circle2 protected: int r; public:,void setx (int x) r=x; void write( )

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

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

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