C--程序设计教程第二版课件.ppt
《C--程序设计教程第二版课件.ppt》由会员分享,可在线阅读,更多相关《C--程序设计教程第二版课件.ppt(61页珍藏版)》请在三一办公上搜索。
1、21:41:12,1,C+程序设计教程(第二版),第十章 继承 Chapter 10 Inheritance,清华大学出版社 钱 能,21:41:12,2,第十章 继 承,继承结构(Inheritance Structure)访问父类成员(Access Fathers Member)派生类的构造(Constructing Derived Classes)继承方式(Inheritance Mode)继承与组合(Inheritance&Composition)多继承概念(Multi-Inheritance Concept)多继承技术(Multi-Inheritance Technology),21
2、:41:12,3,1.继承结构(Inheritance Structure),类层次结构宇宙万事万物都是分类分层的,解决问题可以从事物之间的上下关系中着手这是继承引入程序设计的前提例如:各类型的交通工具之间具有继承关系。,21:41:12,4,21:41:12,5,基类(父类):派生新类的类派生类(子类):从基类派生而成的类基类和派生类:构成类的层次关系单继承:从一个基类派生而成的类多继承:从多个基类派生而成的类继承方式:公有继承、私有继承、保护继承,21:41:12,6,派生类的定义语法:class 派生类名:访问控制 基类名;访问控制:public、protected、private缺省为
3、:private继承方式公有继承 派生时用“public”作访问控制私有继承 派生时用“private”作访问控制保护继承 派生时用“protected”作访问控制,21:41:12,7,继承方式继承方式与访问控制:访问控制符 继承方式 public 公有继承 private 私有继承 protected 保护继承注意:如果类之间没有继承关系则保护成员和私有成员类似;但在类的继承关系中,保护成员在其子类中可以被直接访问,而私有成员在它的子类中也不能被直接访问。,21:41:12,8,公有继承:基类的公有段成员被继承为公有的,基类的保护段成员被继承为保护的。派生时用“public”作访问控制。保
4、护继承:基类的公有段成员和保护段成员被继承为保护的,派生时用“protected”作访问控制。私有继承:基类的公有段成员和保护段成员被继承为私有的,派生时用“private”作访问控制。基类的私有成员在任何情况下都是基类所私有的,在基类以外都不能访问!,21:41:12,9,公有成员:一个类的公有成员允许本类的成员函数、本类的对象、派生类的成员函数、公有派生类的对象直接访问,不允许保护和私有派生类的对象直接访问。私有成员:一个类的私有成员只允许本类的成员函数直接访问。保护成员:允许本类的成员函数、派生类的成员函数直接访问,不允许对象直接访问。,21:41:12,10,21:41:12,11,例
5、如:一个含有不同继承方式的类的继承结构。class Base int b1;protected:int b2;void fb2()b1=1;public:int b3;void fb3()b1=1;,21:41:12,12,class Pri:private Basepublic:void test()b1=1;/error b2=1;/ok b3=1;/ok fb2();/ok fb3();/ok;,class FromPri:public Pripublic:void test()b1=1;/error b2=1;/error b3=1;/error fb2();/error fb3();
6、/error;,21:41:12,13,class Pro:protected Basepublic:void test()b1=1;/error b2=1;/ok b3=1;/ok fb2();/ok fb3();/ok;,class FromPro:public Propublic:void test()b1=1;/error b2=1;/ok b3=1;/ok fb2();/ok fb3();/ok;,21:41:12,14,class Pub:public Basepublic:void test()b1=1;/error b2=1;/ok b3=1;/ok fb2();/ok fb3
7、();/ok;,class FromPub:public Pubpublic:void test()b1=1;/error b2=1;/ok b3=1;/ok fb2();/ok fb3();/ok;,21:41:12,15,int main()Pri priObj;priObj.b1=1;/error priObj.b2=1;/error priObj.b3=1;/error Pro proObj;proObj.b1=1;/error proObj.b2=1;/error proObj.b3=1;/error Pub pubObj;pubObj.b1=1;/error pubObj.b2=1
8、;/error pubObj.b3=1;/ok,21:41:12,16,说明:私有继承时,基类中不管是公有的,还是保护的,一律在子类中变成私有成员。保护继承时,基类中公共和保护的成员在子类中变成保护的。公共继承时,基类中为公共、保护的成员在子类中仍保持为公共、保护的。在继承关系中,基类的private成员不但对应用程序隐藏,对派生类也隐藏。而基类的保护成员则只对应用程序隐藏,而对派生类则毫不隐瞒。,21:41:12,17,在派生类中,可以调整成员的访问控制属性!class Base int b1;protected:int b2;void fb2()b1=1;public:int b3;voi
9、d fb3()b1=1;class Pri:private Basepublic:using Base:fb3;/fb3从私有转为公有 using Base:b1;/error!b1不可见;int main()Pri pri;pri.fb3();/ok,21:41:12,18,说明:在派生类中调整访问控制属性的前提是在派生类中该成员必须是可见的注意:在写程序时,数据成员一般设置为私有的;,21:41:12,19,派生类对象结构,对于下面的继承关系:class Father int a,b;public:/成员函数;class Son:public Father int c;public:/成员
10、函数;,基类对象子类对象说明:派生类中含有基类的数据成员,子类对象空间总是不小于基类对象,c,a,b,a,b,基类部分,子类添加部分,21:41:12,20,2.访问父类成员(Access Fathers Member),继承父类成员例如:有一个学生类Student,现在要增加研究生类,研究生类除了自己所特有的性质外,还具有学生类的所有性质,下面用继承的方法来重用学生类的代码。,21:41:12,21,class Advisor/导师类 int noOfMeeting;class Student/学生类 string name;int semesterHours;/学时 double aver
11、age;/平均分public:Student(string pName=noName):name(pName),average(0),semesterHours(0),21:41:12,22,void addCourse(int hours,double grade)double totalGrade=(semesterHours*average+grade);/总分 semesterHours+=hours;/总修学时 average=semesterHours?totalGrade/semesterHours:0;/平均分 void display()coutname=name,hours
12、=“semesterHours,average=averagen;int getHours()return semesterHours;double getAverage()return average;,21:41:12,23,class GraduateStudent:public Student/研究生类(继承学生类)Advisor advisor;/导师 int qualifierGrade;/资格考试分数public:int getQualifier()return qualifierGrade;int main()Student ds(Lo lee undergrade);Grad
13、uateStudent gs;ds.addCourse(3,2.5);ds.display();gs.addCourse(3,3.0);gs.display();运行结果:name=Lo lee Undergrad,hours=3,average=0.833333 name=no name,hours=3,average=1,21:41:12,24,void fn(Student函数fn()期望接受Student类对象作为它的参数,来自main()的调用传给它一个GraduateStudent类对象,fn()把它视作Student类对象予以接受。事实上,GraduateStudent的内存布局
14、,也与“gs是研究生,当然也是学生”相吻合。,21:41:12,25,说明:捆绑子类对象可以访问父类成员函数和自身成员函数;捆绑基类对象只能访问基类成员函数,不能访问子类成员函数:ds.addCourse(3,2.5);ds.display();ds.getQualifier();/error gs.addCourse(3,3.0);gs.display();gs.getQualifier();,21:41:12,26,class Father int a;protected:void fp()couta;public:void print()couta;,外来用户:void fn()Son
15、d;d.print();/ok d.disp();/ok d.fp();/error Father f;f.print();/ok f.fp();/error f.disp();/error,子类用户:class Son:public Father int b;public:void disp()fp();/ok print();/ok void ed()a+;/error;,21:41:12,27,3.构造子类对象(Constructing Objects of SubClass),继承中的构造函数和析构函数的说明:1.派生类构造函数的初始化列表中列出的均是直接基类的构造函数。2.构造函数不
16、能被继承,因此派生类的构造函数只能通过调用基类的某个构造函数(如果有定义的话)来初始化基类子对象。3.派生类的构造函数只负责初始化自己定义的数据成员。,21:41:12,28,4.派生类构造函数被调用时,在还没有执行构造函数体之前,先调用基类的构造函数,再调用派生类对象成员所属类的构造函数,完成对象所需空间的分配;最后执行派生类自身的构造函数。(若基类上面还有基类,优先调用上面基类的构造函数;派生类的对象成员的构造函数被调用的顺序取决于在类中声明的顺序)5.派生类的对象的生存期结束时调用派生类的析构函数,在该析构函数结束之前再调用基类的析构函数;所以,析构函数的被调用次序与构造函数相反。,21
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 教程 第二 课件

链接地址:https://www.31ppt.com/p-4009295.html