资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
第11页 / 共26页
第12页 / 共26页
第13页 / 共26页
第14页 / 共26页
第15页 / 共26页
第16页 / 共26页
第17页 / 共26页
第18页 / 共26页
第19页 / 共26页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,/25,大学C+程序设计教程,西安交通大学,计算机教学实验中心,http:/,大学C+程序设计教程,第10章 继承和派生,本章目标,1掌握继承和派生的概念,派生类的定义方法。,2继承的不同方式对基类成员的访问控制,3掌握单继承的概念、定义方法、单继承派生类构造函数的执行顺序。,4.理解多继承的概念,5.虚基类的概念和定义,1,第10章 继承和派生本章目标1,授课内容,10.1 基类与派生类,10.2 派生类的继承方式,10.3 派生类的构造函数和析构函数,10.4 接口和实现方法的分离,10.5 显示访问基类成员,10.6 使用this指针,2,授课内容10.1 基类与派生类 2,水果的分类,3,水果的分类3,10.1 继承和派生,从一个或多个以前定义的类(基类)产生新类的过程称为派生,这个新类又称为派生类。,类的继承(inheritance)是指新类从基类那里得到基类的特征,也就是继承基类的数据和函数。,派生的新类同时也可以增加或重新定义数据和操作,这就产生了类的层次性。,派生就是创建一个具有别的类的属性和行为的新类的能力。派生和继承的概念也来自于人们认识客观世界的过程。,4,10.1 继承和派生从一个或多个以前定义的类(基类)产生新类,层次概念,客观世界本身是有层次的,人们认识客观世界的过程中,由一般到特殊的演绎思维发挥着巨大作用。演绎的过程在绝大多数情况下就表现为层次分类的过程。继承使得程序员可以在一个较一般的类的基础上很快地建立一个新类,而不必从零开始设计每个类。,5,层次概念客观世界本身是有层次的,人们认识客观世界的过程中,由,继承常用来表示类属关系,不能将继承理解为构成关系。当从现存类中派生出新类时,可以对派生类做如下几种变化:,可以增加新的数据成员;,可以增加新的成员函数;,可以重新定义已有的成员函数;,可以改变现有成员的属性。,6,继承常用来表示类属关系,不能将继承理解为构成关系。当从现存类,基类1,基类2,基类n,派生类1,派生类2,基类,派生类1,派生类2,(,a,)多重继承,(,b,)单继承,一个基类可以直接派生出多个派生类,派生出来的新类同样可以作为基类再继续派生出更新的类,依此类推形成一个,层次结构,。,多重继承与单继承,如果一个派生类可以同时有多个基类,称为多重继承(multiple-inheritance),这时的派生类同时得到了多个已有类的特征。一个派生类只有一个直接基类的情况称为单一继承(single-inheritance)。,7,基类1基类2基类n派生类1派生类2基类派生类1派生类2(,派生类的定义格式:,class 派生类名:访问权限 基类名1,访问限定符 基类名2,访问限定符 基类名n,private:,成员表1;/派生类增加或替代的私有成员,public:,成员表2;/派生类增加或替代的公有成员,protected:,成员表3;/派生类增加或替代的保护成员,;/分号不可少,8,派生类的定义格式:class 派生类名:访问权限 基类,其中基类1,基类2,是已声明的类。在派生类定义的类体中给出的成员称为派生类成员,它们是新增加的数据和函数成员。这些新增加的成员是派生类对基类的发展,它们给派生类添加了不同于基类的新的属性和功能。派生类成员包括新添加的,也包括通过屏蔽作用,取代基类成员的更新成员,9,其中基类1,基类2,是已声明的类。在派生类定义的类体中,访问控制,,亦称为,继承方式,,是对基类成员进一步的限制。访问控制也是三种:,公有(,public,)方式,保护(,protected,)方式和私有(,private,)方式,,亦称公有继承、保护继承和私有继承。,编制派生类时可分四步,吸收基类的成员,改造基类成员,发展新成员,重写构造函数与析构函数,派生类中成员的变化,不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收,声明一个和某基类成员同名的新成员派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override),派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展。,10,访问控制,亦称为继承方式,是对基类成员进一步的限制。,10.2 派生类的继承方式,不可直接访问,不可直接访问,private,不可直接访问,private,protected,不可直接访问,private,public,私有派生,不可直接访问,不可直接访问,private,不可直接访问,protected,protected,可直接访问,public,public,公有派生,外部函数void main(),在派生类中对基类成员的访问限定,基类中的访问限定,派生方式,在派生类的定义中,基类前所加的访问限定符有两方面含义:,派生类成员(新增成员)函数对基类(继承来的)成员的访问(调用和操作),,和,从派生类对象之外对派生类对象中的基类成员的访问,。,公有派生是绝对主流,。,11,10.2 派生类的继承方式不可直接访问 不可直接访问 pr,实例:公有继承(public),class Person/人员类定义,protected:,char Name10;/姓名,intAge;/年龄,charSex;/性别,public:,void Register(char*name,int age,char sex);,void ShowMe();,;,12,实例:公有继承(public)class Person/,class Employee:public Person/雇员类定义,char Dept20;/工作部门,float Salary;/月薪,public:,Employee();,void EmployeeRegister(char*name,int age,char sex,char*dept,float salary);,void ShowEmp();/显示雇员信息,;,13,class Employee:public Person,保护继承(public),保护继承方式创建的派生类对基类各种成员访问权限如下:,基类的公有成员和保护成员都相当于派生类的保护成员,派生类可以通过自身的成员函数或其子类的成员函数访问他们,对于基类的私有成员,无论派生类内部成员或派生类使用者都无法直接访问,14,保护继承(public)保护继承方式创建的派生类对基类各种,10.3 派生类的构造函数和析构函数,派生类构造函数的一般形式为:,派生类名:派生类名(参数总表):基类名1(参数表1),基类名n(参数表n),,内嵌对象名1(对象参数表1),内嵌对象名m(对象参数表m),派生类新增加成员的初始化;,派生类与基类的析构函数没有什么联系,彼此独立,派生类或基类的析构函数只作各自类对象消亡前的善后工作,15,10.3 派生类的构造函数和析构函数派生类构造函数的一般形式,派生类构造函数各部分的执行次序为:,1.调用基类构造函数,按它们在派生类定义的先后顺序,顺序调用。,2.调用内嵌对象构造函数,调用次序按各个对象在派生类内声明的顺序。,3.派生类的构造函数体中的操作。,*在派生类构造函数中,只要基类不是使用缺省构造函数都要显式给出基类名和参数表。如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。,16,派生类构造函数各部分的执行次序为:1.调用基类构造函数,按它,例10-3 派生类构造函数和析构函数的执行,#include,#include,class Person,char Name10;intAge;,public:,Person(char*name,int age),strcpy(Name,name);Age=age;,coutconstructor of personNameendl;,Person()coutdeconstrutor of personNameendl;,;,17,例10-3 派生类构造函数和析构函数的执行#include,class Employee:public Person,char Dept20;PersonWang;,public:,Employee(char*name,int age,char*dept,char*name1,int age1),:Person(name,age),Wang(name1,age1),strcpy(Dept,dept);,coutconstructor of Employeeendl;,Employee()coutdeconstrucor of Employeeendl;,;,18,class Employee:public Person,int main(),Employee emp(张弓长,40,人事处,李木子,36);,return 0;,19,int main()19,派生类构造函数的执行次序,首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行。,其次,调用内嵌对象构造函数,调用次序按各个对象在派生类内声明的顺序。,最后,执行派生类构造函数体中的内容。,20,派生类构造函数的执行次序首先,调用基类构造函数,调用顺序按照,析构函数,派生类析构函数执行过程恰与构造函数执行过程相反。,首先执行派生类析构函数,然后执行内嵌对象的析构函数,最后执行基类析构函数,21,析构函数 派生类析构函数执行过程恰与构造函数执行过程相反。2,自学内容,接口与实现方法的分离,显式访问基类成员,this指针,22,自学内容接口与实现方法的分离22,程序设计举例,例10-6 一个基类及其两个派生类,例10-7,多重继承,从多个基类派生出来的类,class Derived:public Base1,public Base2,double real;,public:,Derived(int,char,double);,double getReal()const;,void Output();,;,23,程序设计举例例10-6 一个基类及其两个派生类23,编程实例:棋子类,class ChineseStone :public Stone,char strType10;/棋子类型,intR;/棋子半径,public:,ChineseStone(int color,int col,int row,char*type);,/构造函数,void Show();/显示信息,;,24,编程实例:棋子类class ChineseStone :,补充习题,1.定义一个Point类,其成员有x,y;从Point派生Rectangle类,添加成员l,w;从Rectangle类派生Box类,添加成员h;编写主程序验证。,25,补充习题1.定义一个Point类,其成员有x,y;从Poin,
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6