【教学课件】第11章继承与派生.ppt
《【教学课件】第11章继承与派生.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第11章继承与派生.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第1111章章继承与派生承与派生王雪晶内容11.1继承与派生的概念11.2派生类的声明方式11.3派生类的构成11.4派生类成员的访问属性11.5派生类的构造函数和析构函数11.6多重继承11.7基类与派生类的转换11.8继承与组合面向对象程序设计的特点n抽象n封装n继承n多态性classEmployeestringfirst_name,family_name;charmiddle_initial;Datehiring_date;shortdepartment;/.;classManagerEmployeeemp;/managersemployeerecordlistgroup;/peopl
2、emanagedshortlevel;/.;考虑做一个程序,处理某公司所雇佣人员的问题。雇员的数据结构经理的数据结构11.1继承与派生的概念n在C+中可重用性是通过继承机制来实现的。n所谓“继承”就是在一个已存在类的基础上建立一个新的类。n已存在的类称为“基类”或“父类”。n新建立的类称为“派生类”或“子类”。11.1继承与派生的概念n一个派生类只从一个基类派生,这称为单继承。箭头表示继承的方向,从派生类指向基类。11.1继承与派生的概念n一个派生类有两个或多个基类的称为多重继承。关于基类和派生类的关系:n派生类是基类的具体化n基类则是派生类的抽象基类Student,通过单继承建立派生类Stu
3、dent1:classStudent1:publicStudent/声明基类是Studentpublic:voiddisplay_1()/新增加的成员函数coutage:ageendl;coutaddress:addrnumnamesex;voiddisplay()coutnum:numendl;coutname:nameendl;coutsex:sexendl;private:/基类私有成员intnum;stringname;charsex;公用继承classStudent1:publicStudentpublic:voiddisplay_1()coutnum:numendl;/错误cout
4、name:nameendl;/错误coutsex:sexendl;/错误coutage:ageendl;coutaddress:addrendl;private:intage;stringaddr;可以将派生类Student1的声明改为classStudent1:publicStudentpublic:voiddisplay_1()coutage:ageendl;/正确coutaddress:addrendl;/正确private:intage;stringaddr;intmain()Student1stud;stud.display();stud.display_1();return0;私有
5、继承classStudent1:privateStudentpublic:voiddisplay_1()/输出两个数据成员的值coutage:ageendl;/正确coutaddress:addrendl;/正确private:intage;stringaddr;intmain()Student1stud1;stud1.display();/错误stud1.display_1();/正确stud1.age=18;/错误return0;可将上面的私有派生类的成员函数定义改写voiddisplay_1()/输出5个数据成员的值display():coutage:ageendl;coutaddres
6、s:addrendl;main函数可改写为intmain()Student1stud1;stud1.display_1();return0;从类的用户角度来看,保护成员等价于私有成员。但有一点与私有成员不同,保护成员可以被派生类的成员函数引用。保护成员和保护继承基类成员在派生类的访问属性基类中的成员公用派生私有派生保护派生私有成员不可访问不可访问不可访问公用成员公用私有保护保护成员保护私有保护例11.3在派生类中引用保护成员。#include#includeusingnamespacestd;classStudent/声明基类public:/基类公用成员voiddisplay();protec
7、ted:/基类保护成员intnum;stringname;charsex;voidStudent:display()/定义基类成员函数coutnum:numendl;coutname:nameendl;coutsex:sexendl;classStudent1:protectedStudentpublic:voiddisplay1();/派生类公用成员函数private:intage;/派生类私有数据成员stringaddr;/派生类私有数据成员;voidStudent1:display1()/定义派生类公用成员函数coutnum:numendl;/合法coutname:nameendl;/合
8、法coutsex:sexendl;/合法coutage:ageendl;/合法coutaddress:addrendl;/合法intmain()Student1stud1;stud1.display1();/合法stud1.num=10023;/错误return0;多级派生时的访问属性n类B称为类A的直接派生类,类C称为类A的间接派生类。n类A是类B的直接基类,是类C的间接基类。例:多级派生的访问属性。classA/基类public:inti;protected:voidf2();intj;private:intk;classB:publicA/public方式public:voidf3();
9、protected:voidf4();private:intm;classC:protectedB/protected方式public:voidf5();private:intn;各成员在不同类中的访问属性如下:if2jk f3f4 m f5 n基类基类A公公用用 保保护护 保保护护 私私有有公公用用派派生类生类B 公公用用 保保护护 保保护护 不不可可访问访问 公公用用 保保护护 私私有有 保保护护派派生类生类C 保保护护 保保护护 保保护护 不不可可访问访问 保保护护 保保护护 不不可可访问访问 公公用用 私私有有11.5派生类的构造函数和析构函数n设计派生类的构造函数n派生类所增加的数据
10、成员的初始化n基类的数据成员初始化n思路:n在执行派生类的构造函数时,调用基类的构造函数。#include#includeusingnamespacestd;classStudentpublic:Student(intn,stringnam,chars)/基类构造函数num=n;name=nam;sex=s;Student()/基类析构函数protected:/保护部分intnum;stringname;charsex;11.5.1简单的派生类的构造函数classStudent1:publicStudent/声明派生类Student1public:/派生类的公用部分Student1(intn,
11、stringnam,chars,inta,stringad):Student(n,nam,s)age=a;addr=ad;voidshow()coutnum:numendl;coutname:nameendl;coutsex:sexendl;coutage:ageendl;coutaddress:addrendlendl;Student1()/派生类析构函数private:/派生类的私有部分intage;stringaddr;intmain()Student1stud1(10010,Wang-li,f,19,115BeijingRoad,Shanghai);Student1stud2(1001
12、1,Zhang-fun,m,21,213ShanghaiRoad,Beijing);stud1.show();/输出第一个学生的数据stud2.show();/输出第二个学生的数据return0;n其一般形式为派生类构造函数名(总参数表列):基类构造函数名(参数表列)派生类中新增数据成员初始化语句11.5.1简单的派生类的构造函数将派生类构造函数在类外面定义n类体中的函数声明:Student1(intn,stringnam,chars,inta,stringad);n类外的派生类构造函数定义:Student1Student1(intn,stringnam,chars,inta,stringad
13、):Student(n,nam,s)age=a;addr=ad;11.5.1简单的派生类的构造函数n执行构造函数的顺序是:1.派生类构造函数先调用基类构造函数;2.再执行派生类构造函数本身(即派生类构造函数的函数体)。n在派生类对象释放时1.先执行派生类析构函数Student1()2.再执行其基类析构函数Student()。Manager:Manager(conststring&n,intd,intlvl):family_name(n),/error:family_namenotdeclaredinmanagerdepartment(d),/error:departmentnotdeclare
14、dinmanagerlevel(lvl)/.派生类的构造函数只能描述它自己的成员和自己的直接基类的初始式,它不能直接去初始化基类的成员。11.5.1简单的派生类的构造函数11.5.2有子对象的派生类的构造函数n类的数据成员中可以包含类对象,如:Students1;ns1就是类对象中的内嵌对象,称为子对象,即对象中的对象。例11.6包含子对象的派生类的构造函数。#include#includeusingnamespacestd;classStudentpublic:/公用部分Student(intn,stringnam)/基类构造函数num=n;name=nam;voiddisplay()cou
15、tnum:numendlname:nameendl;protected:/保护部分intnum;stringname;classStudent1:publicStudent/声明公用派生类Student1public:Student1(intn,stringnam,intn1,stringnam1,inta,stringad):Student(n,nam),monitor(n1,nam1)/派生类构造函数age=a;addr=ad;voidshow();voidshow_monitor();/成员函数,输出子对象private:/派生类的私有数据Studentmonitor;/定义子对象(班长
16、)intage;stringaddr;voidStudent1:show()coutThisstudentis:endl;display();/输出num和namecoutage:ageendl;/输出agecoutaddress:addrendlendl;/输出addrvoidStudent1:show_monitor()coutendlClassmonitoris:endl;monitor.display();/调用基类成员函数intmain()Student1stud1(10010,Wang-li,10001,Li-sun,19,115BeijingRoad,Shanghai);stud
17、1.show();/输出学生的数据stud1.show_monitor();/输出子对象的数据return0;11.5.2有子对象的派生类的构造函数派生类构造函数的任务应该包括3个部分:(1)对基类数据成员初始化;(2)对子对象数据成员初始化;(3)对派生类数据成员初始化。11.5.2有子对象的派生类的构造函数n执行派生类构造函数的顺序是:调用基类构造函数,对基类数据成员初始化;调用子对象构造函数,对子对象数据成员初始化;再执行派生类构造函数本身,对派生类数据成员初始化。11.5.3多层派生时的构造函数一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。例11.7 多级派
18、生情况下派生类的构造函数。#include#includeusingnamespacestd;classStudentpublic:/公用部分Student(intn,stringnam)/基类构造函数num=n;name=nam;voiddisplay()/输出基类数据成员coutnum:numendl;coutname:nameendl;protected:/保护部分intnum;/基类有两个数据成员stringname;classStudent1:publicStudentpublic:Student1(intn,charnam10,inta):Student(n,nam)age=a;v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 11 继承 派生
限制150内