欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第11章继承与派生.ppt

    • 资源ID:5657763       资源大小:438KB        全文页数:87页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【教学课件】第11章继承与派生.ppt

    第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 recordlist group;/people managedshort level;/.;,考虑做一个程序,处理某公司所雇佣人员的问题。,雇员的数据结构,经理的数据结构,11.1 继承与派生的概念,在C+中可重用性是通过继承机制来实现的。所谓“继承”就是在一个已存在类的基础上建立一个新的类。已存在的类称为“基类”或“父类”。新建立的类称为“派生类”或“子类”。,11.1 继承与派生的概念,一个派生类只从一个基类派生,这称为单继承。,箭头表示继承的方向,从派生类指向基类。,11.1 继承与派生的概念,一个派生类有两个或多个基类的称为多重继承。,关于基类和派生类的关系:派生类是基类的具体化基类则是派生类的抽象,基类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.3 派生类的构成,成员包括:从基类继承过来的成员自己增加的成员,构造派生类包括以下几个部分,从基类接收成员(不包括构造函数和析构函数)。调整从基类接收的成员。(继承方式、覆盖)在声明派生类时增加的成员。在声明派生类时,一般还应定义派生类的构造函数和析构函数。,派生类的实现:将派生类的对象也表示为一个基类的对象,只是将那些特别属于派生类的信息附加在最后。,从Employee派生出Manager,就使Manager成为Employee的一个子类型,使Manager可以用在能够接受Employee的任何地方。,11.4 派生类成员的访问属性,公用继承:基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。私有继承:基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。保护继承:基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。,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 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;string 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;/错误 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;class 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 Student1: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:int 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#includeusing 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(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 Shanghai 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,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 manager 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 display()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:/派生类的私有数据 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,10001,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 多层派生时的构造函数,一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。,例11.7 多级派生情况下派生类的构造函数。#include#includeusing namespace std;class Student public:/公用部分 Student(int n,string nam)/基类构造函数 num=n;name=nam;void display()/输出基类数据成员 coutnum:numendl;coutname:nameendl;protected:/保护部分 int num;/基类有两个数据成员 string name;,class Student1:public Student public:Student1(int n,char nam10,int a):Student(n,nam)age=a;void show()/输出num,name和age display();/输出num和name coutage:ageendl;private:/派生类的私有数据 int age;/增加一个数据成员;,class Student2:public Student1 public:Student2(int n,string nam,int a,int s):Student1(n,nam,a)score=s;void show_all()/输出全部数据成员 show();/输出num和name coutscore:scoreendl;/输出age private:int score;/增加一个数据成员;int main()Student2 stud(10010,Li,17,89);stud.show_all();/输出学生的全部数据 return 0;,派生关系如图所示,11.5.4 派生类构造函数的特殊形式,当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空。如果在基类中构造函数没有参数,那么在定义派生类构造函数时可不写基类构造函数。如果在基类和子对象类型的声明中都没有定义带参数的构造函数,而且也不需对派生类自己的数据成员初始化,则可以不必显式地定义派生类构造函数。,11.5.4 派生类构造函数的特殊形式,如果在基类或子对象类型的声明中定义了带参数的构造函数,那么就必须显式地定义派生类构造函数,并在派生类构造函数中写出基类或子对象类型的构造函数及其参数表。如果在基类中既定义无参的构造函数,又定义了有参的构造函数(构造函数重载),则在定义派生类构造函数时,既可以包含基类构造函数及其参数,也可以不包含基类构造函数。,11.5.5 派生类的析构函数,派生类析构函数对派生类中所增加的成员进行清理工作。在执行派生类的析构函数时,系统会自动调用基类的析构函数和子对象的析构函数,对基类和子对象进行清理。调用的顺序与构造函数正好相反:先执行派生类自己的析构函数然后调用子对象的析构函数,对子对象进行清理最后调用基类的析构函数,对基类进行清理。,11.6 多重继承,一个派生类有两个或多个基类,派生类从两个或多个基类中继承所需的属性。这种行为称为多重继承。,class D:public A,private B,protected C类D新增加的成员,11.6.2 多重继承派生类的构造函数,派生类构造函数名(总参数表列):基类1构造函数(参数表列)基类2构造函数(参数表列)基类3构造函数(参数表列)派生类中新增数成员据成员初始化语句执行顺序,例11.8 声明一个教师(Teacher)类和一个学生(Student)类,用多重继承的方式声明一个研究生(Graduate)派生类。教师类中包括数据成员name(姓名)、age(年龄)、title(职称)。学生类中包括数据成员name1(姓名)、age(性别)、score(成绩)。在定义派生类对象时给出初始化的数据,然后输出这些数据。#include#include using namespace std;,class Teacher/声明类Teacher(教师)public:/公用部分 Teacher(string nam,int a,string t)/构造函数 name=nam;age=a;title=t;void display()/输出教师有关数据 coutname:nameendl;coutageageendl;couttitle:titleendl;protected:/保护部分 string name;int age;string title;/职称;,class Student/定义类Student(学生)public:Student(char nam,char s,float sco)strcpy(name1,nam);sex=s;score=sco;/构造函数 void display1()/输出学生有关数据 coutname:name1endl;coutsex:sexendl;coutscore:scoreendl;protected:/保护部分 string name1;char sex;float score;/成绩;,class Graduate:public Teacher,public Student public:Graduate(string nam,int a,char s,string t,float sco,float w):Teacher(nam,a,t),Student(nam,s,sco),wage(w)void show()coutname:nameendl;coutage:ageendl;coutsex:sexendl;coutscore:scoreendl;couttitle:titleendl;coutwages:wageendl;private:float wage;/工资;,int main()Graduate grad1(Wang-li,24,f,assistant,89.5,1234.5);grad1.show();return 0;程序运行结果如下:name:Wang-li age:24sex:fscore:89.5 title:assistancewages:1234.5,11.6.3 多重继承引起的二义性问题,二义性问题:由于继承的成员同名而产生的。分别讨论下列3种情况:,(1)两个基类有同名成员。,class Apublic:int a;void display();class Bpublic:int a;void display();class C:public A,public Bpublic:int b;void show();,C c1;c1.a=3;c1.display();,可以用基类名来限定:c1.A:a=3;c1.A:display();,(2)两个基类和派生类三者都有同名成员。class C:public A,public Bpublic:int a;void display();,C c1;c1.a=3;c1.display();,要在派生类外访问基类A中的成员,应指明作用域Ac1.A:a=3;c1.A:display();,(3)如果类A和类B是从同一个基类派生,class B:public Npublic:int a2;class C:public A,public Bpublic:int a3;void show()couta3=a3endl;,class Npublic:int a;void display()coutA:a=”aendl;class A:public Npublic:int a1;,派生类C中成员,怎样访问类A中从基类N继承下来的成员?c1.a=3;c1.display();或c1.N:a=3;c1.N:display();/error通过类N的直接派生类名来指出:c1.A:a=3;c1.A:display();,11.6.4 虚基类,1.虚基类的作用使得在继承间接共同基类时只保留一份成员。,将类A声明为虚基类,方法如下:class A/声明基类A;class B:virtual public A;class C:virtual public A;声明虚基类的一般形式为class 派生类名:virtual 继承方式 基类名,virtual,virtual,2.虚基类的初始化如果虚基类只有带参数的构造函数,则在其所有派生类通过构造函数的初始化表对虚基类进行初始化。class A/定义基类A A(int i)/基类构造函数,有一个参数;class B:virtual public A/A作为B的虚基类 B(int n):A(n);class C:virtual public A/A作为C的虚基类 C(int n):A(n);class D:public B,public C D(int n):A(n),B(n),C(n);,3.虚基类的简单应用举例,#include#include using namespace std;class Personpublic:Person(string nam,char s,int a)/构造函数 name=nam;sex=s;age=a;protected:/保护成员 string name;char sex;int age;,class Teacher:virtual public Person public:Teacher(string nam,char s,int a,string t):Person(nam,s,a)title=t;protected:string title;/职称;,class Student:virtual public Personpublic:Student(string nam,char s,int a,float sco):Person(nam,s,a)score=sco;protected:float score;/成绩;,class Graduate:public Teacher,public Studentpublic:Graduate(string nam,char s,int a,string t,float sco,float w):Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w)void show()/输出研究生的有关数据 coutname:nameendl;coutage:ageendl;coutsex:sexendl;coutscore:scoreendl;couttitle:titleendl;coutwages:wageendl;private:float wage;/工资;,11.7 基类与派生类的转换,(1)派生类对象可以向基类对象赋值。A a1;/定义基类A对象a1B b1;/定义类A的公用派生类B的对象b1a1=b1;/用派生类B对象b1对基类对象a1赋值,11.7 基类与派生类的转换,(2)派生类对象可以向基类对象的引用进行赋值或初始化。A a1;B b1;A,11.7 基类与派生类的转换,(3)如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类对象。如:void fun(A,11.7 基类与派生类的转换,(4)派生类对象的地址可以赋给指向基类对象的指针变量。A*pa;B b1;pa=例11.10 定义一个基类Student(学生),再定义Student类的公用派生类Graduate(研究生),用指向基类对象的指针输出数据。,#include#include using namespace std;class Student/声明Student类public:Student(int,string,float);/声明构造函数 void display();/声明输出函数private:int num;string name;float score;Student:Student(int n,string nam,float s)/定义构造函数num=n;name=nam;score=s;,void Student:display()/定义输出函数coutendlnum:numendl;coutname:nameendl;coutscore:scoreendl;class Graduate:public Studentpublic:Graduate(int,string,float,float);/声明构造函数 void display();/声明输出函数private:float pay;/工资;Graduate:Graduate(int n,string nam,float s,float p):Student(n,nam,s),pay(p),void Graduate:display()/定义输出函数Student:display();/调用Student类的display函数 coutdisplay();pt=,11.8 继承与组合,在一个类中以另一个类的对象作为数据成员的,称为类的组合。,class Teacher/教师类public:private:int num;string name;char sex;class BirthDate public:private:int year;int month;int day;,class Professor:public Teacherpublic:private:BirthDate birthday;,继承是纵向的,组合是横向的,void fun1(Teacher/错误,

    注意事项

    本文(【教学课件】第11章继承与派生.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开