【教学课件】第11章继承与派生.ppt
《【教学课件】第11章继承与派生.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第11章继承与派生.ppt(87页珍藏版)》请在三一办公上搜索。
1、第11章 继承与派生,王雪晶,内容,11.1 继承与派生的概念11.2 派生类的声明方式11.3 派生类的构成11.4 派生类成员的访问属性11.5 派生类的构造函数和析构函数11.6 多重继承11.7 基类与派生类的转换11.8 继承与组合,面向对象程序设计的特点,抽象封装继承多态性,class Employee string first_name,family_name;char middle_initial;Date hiring_date;short department;/.;,class Manager Employee emp;/managers employee recordl
2、ist group;/people managedshort level;/.;,考虑做一个程序,处理某公司所雇佣人员的问题。,雇员的数据结构,经理的数据结构,11.1 继承与派生的概念,在C+中可重用性是通过继承机制来实现的。所谓“继承”就是在一个已存在类的基础上建立一个新的类。已存在的类称为“基类”或“父类”。新建立的类称为“派生类”或“子类”。,11.1 继承与派生的概念,一个派生类只从一个基类派生,这称为单继承。,箭头表示继承的方向,从派生类指向基类。,11.1 继承与派生的概念,一个派生类有两个或多个基类的称为多重继承。,关于基类和派生类的关系:派生类是基类的具体化基类则是派生类的抽
3、象,基类Student,通过单继承建立派生类Student1:class Student1:public Student/声明基类是Studentpublic:void display_1()/新增加的成员函数 coutage:ageendl;coutaddress:addrendl;private:int age;/新增加的数据成员 string addr;/新增加的数据成员;,11.2 派生类的声明方式,声明派生类的一般形式为class 派生类名:继承方式 基类名 派生类新增加的成员;继承方式包括:public(公用的)private(私有的)(默认的)protected(受保护的),11
4、.3 派生类的构成,成员包括:从基类继承过来的成员自己增加的成员,构造派生类包括以下几个部分,从基类接收成员(不包括构造函数和析构函数)。调整从基类接收的成员。(继承方式、覆盖)在声明派生类时增加的成员。在声明派生类时,一般还应定义派生类的构造函数和析构函数。,派生类的实现:将派生类的对象也表示为一个基类的对象,只是将那些特别属于派生类的信息附加在最后。,从Employee派生出Manager,就使Manager成为Employee的一个子类型,使Manager可以用在能够接受Employee的任何地方。,11.4 派生类成员的访问属性,公用继承:基类的公用成员和保护成员在派生类中保持原有访问
5、属性,其私有成员仍为基类私有。私有继承:基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。保护继承:基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。,Class Student/声明基类public:/基类公用成员void get_value()cinnumnamesex;void display()cout num:numendl;cout name:nameendl;cout sex:sexendl;private:/基类私有成员 int num;string name;char sex;,公用继承,class Student1:public
6、Studentpublic:void display_1()cout num:numendl;/错误 cout name:nameendl;/错误 cout sex:sexendl;/错误 cout age:ageendl;cout address:addrendl;private:int age;string addr;,可以将派生类Student1的声明改为class Student1:public Studentpublic:void display_1()cout age:ageendl;/正确 cout address:addrendl;/正确private:int age;stri
7、ng addr;int main()Student1 stud;stud.display();stud.display_1();return 0;,私有继承,class Student1:private Studentpublic:void display_1()/输出两个数据成员的值 coutage:ageendl;/正确 coutaddress:addrendl;/正确private:int age;string addr;int main()Student1 stud1;stud1.display();/错误 stud1.display_1();/正确 stud1.age=18;/错误
8、return 0;,可将上面的私有派生类的成员函数定义改写void display_1()/输出5个数据成员的值 display():coutage:ageendl;coutaddress:addrendl;main函数可改写为int main()Student1 stud1;stud1.display_1();return 0;,从类的用户角度来看,保护成员等价于私有成员。但有一点与私有成员不同,保护成员可以被派生类的成员函数引用。,保护成员和保护继承,基类成员在派生类的访问属性,例11.3 在派生类中引用保护成员。#include#include using namespace std;c
9、lass Student/声明基类public:/基类公用成员 void display();protected:/基类保护成员 int num;string name;char sex;void Student:display()/定义基类成员函数 coutnum:numendl;coutname:nameendl;coutsex:sexendl;,class Student1:protected Studentpublic:void display1();/派生类公用成员函数private:int age;/派生类私有数据成员 string addr;/派生类私有数据成员;void Stu
10、dent1:display1()/定义派生类公用成员函数 coutnum:numendl;/合法 coutname:nameendl;/合法 coutsex:sexendl;/合法 coutage:ageendl;/合法 coutaddress:addrendl;/合法,int main()Student1 stud1;stud1.display1();/合法 stud1.num=10023;/错误 return 0;,多级派生时的访问属性,类B称为类A的直接派生类,类C称为类A的间接派生类。类A是类B的直接基类,是类C的间接基类。,例:多级派生的访问属性。class A/基类public:i
11、nt i;protected:void f2();int j;private:int k;class B:public A/public方式public:void f3();protected:void f4();private:int m;,class C:protected B/protected方式public:void f5();private:int n;各成员在不同类中的访问属性如下:,11.5 派生类的构造函数和析构函数,设计派生类的构造函数派生类所增加的数据成员的初始化基类的数据成员初始化思路:在执行派生类的构造函数时,调用基类的构造函数。,#include#includeus
12、ing namespace std;class Student public:Student(int n,string nam,char s)/基类构造函数 num=n;name=nam;sex=s;Student()/基类析构函数protected:/保护部分 int num;string name;char sex;,11.5.1 简单的派生类的构造函数,class Student1:public Student/声明派生类Student1 public:/派生类的公用部分 Student1(int n,string nam,char s,int a,string ad):Student(
13、n,nam,s)age=a;addr=ad;void show()coutnum:numendl;coutname:nameendl;coutsex:sexendl;coutage:ageendl;coutaddress:addrendlendl;Student1()/派生类析构函数 private:/派生类的私有部分 int age;string addr;,int main()Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai);Student1 stud2(10011,Zhang-fun,m,21,213 Shangha
14、i Road,Beijing);stud1.show();/输出第一个学生的数据 stud2.show();/输出第二个学生的数据 return 0;,其一般形式为派生类构造函数名(总参数表列):基类构造函数名(参数表列)派生类中新增数据成员初始化语句,11.5.1 简单的派生类的构造函数,将派生类构造函数在类外面定义类体中的函数声明:Student1(int n,string nam,char s,int a,string ad);类外的派生类构造函数定义:Student1Student1(int n,string nam,char s,int a,string ad):Student(n,
15、nam,s)age=a;addr=ad;,11.5.1 简单的派生类的构造函数,执行构造函数的顺序是:派生类构造函数先调用基类构造函数;再执行派生类构造函数本身(即派生类构造函数的函数体)。在派生类对象释放时先执行派生类析构函数Student1()再执行其基类析构函数Student()。,Manager:Manager(const string&n,int d,int lvl):family_name(n),/error:family_name not declared in manager department(d),/error:department not declared in man
16、ager level(lvl)/.,派生类的构造函数只能描述它自己的成员和自己的直接基类的初始式,它不能直接去初始化基类的成员。,11.5.1 简单的派生类的构造函数,11.5.2 有子对象的派生类的构造函数,类的数据成员中可以包含类对象,如:Student s1;s1就是类对象中的内嵌对象,称为子对象,即对象中的对象。,例11.6 包含子对象的派生类的构造函数。#include#include using namespace std;class Student public:/公用部分Student(int n,string nam)/基类构造函数 num=n;name=nam;void d
17、isplay()coutnum:numendlname:nameendl;protected:/保护部分 int num;string name;,class Student1:public Student/声明公用派生类Student1 public:Student1(int n,string nam,int n1,string nam1,int a,string ad):Student(n,nam),monitor(n1,nam1)/派生类构造函数 age=a;addr=ad;void show();void show_monitor();/成员函数,输出子对象private:/派生类的私
18、有数据 Student monitor;/定义子对象(班长)int age;string addr;,void Student1:show()coutThis student is:endl;display();/输出num和name coutage:ageendl;/输出age coutaddress:addrendlendl;/输出addr void Student1:show_monitor()coutendlClass monitor is:endl;monitor.display();/调用基类成员函数 int main()Student1 stud1(10010,Wang-li,1
19、0001,Li-sun,19,115 Beijing Road,Shanghai);stud1.show();/输出学生的数据 stud1.show_monitor();/输出子对象的数据 return 0;,11.5.2 有子对象的派生类的构造函数,派生类构造函数的任务应该包括3个部分:(1)对基类数据成员初始化;(2)对子对象数据成员初始化;(3)对派生类数据成员初始化。,11.5.2 有子对象的派生类的构造函数,执行派生类构造函数的顺序是:调用基类构造函数,对基类数据成员初始化;调用子对象构造函数,对子对象数据成员初始化;再执行派生类构造函数本身,对派生类数据成员初始化。,11.5.3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 11 继承 派生
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5657763.html