C++程序设计课件:第16章 继承

上传人:cn****1 文档编号:569849946 上传时间:2024-07-31 格式:PPT 页数:60 大小:278.50KB
返回 下载 相关 举报
C++程序设计课件:第16章 继承_第1页
第1页 / 共60页
C++程序设计课件:第16章 继承_第2页
第2页 / 共60页
C++程序设计课件:第16章 继承_第3页
第3页 / 共60页
C++程序设计课件:第16章 继承_第4页
第4页 / 共60页
C++程序设计课件:第16章 继承_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《C++程序设计课件:第16章 继承》由会员分享,可在线阅读,更多相关《C++程序设计课件:第16章 继承(60页珍藏版)》请在金锄头文库上搜索。

1、第16章继承本章主要内容o16.1继承的概念o16.2继承的工作方式o16.3派生类的构造o16.4继承与组合o16.5多态性o16.6多态的思考方式o16.7多态性如何工作o16.8不恰当的虚函数o16.9虚函数的限制p16.10 类的冗余p16.11 克服冗余带来的问题p16.12 类的分解p16.13 抽象类p16.14 由抽象类派生具体类p16.15 纯虚函数的需要性p作业216.1继承的概念o基类(父类):派生新类的类o派生类(子类):从基类派生而成的类o基类和派生类:构成类的层次关系o单继承:从一个基类派生而成的类o多继承:从多个基类派生而成的类o继承类别:公有继承、私有继承、保护

2、继承o访问控制:决定子类对父类的访问权限316.1继承的概念交通工具交通工具汽车汽车小汽车小汽车卡车卡车旅行车旅行车工具车工具车轿车轿车面包车面包车图16-1 继承的类层次416.1继承的概念o继承类别与访问控制:访问控制继承类别public 公有继承private私有继承protected保护继承516.2继承的工作方式1.派生类的定义o语法:class派生类名:访问控制基类名;o访问控制:private、public、protectedo缺省为:private2.继承方式公有继承:派生时用“public”作访问控制私有继承:派生时用“private”作访问控制保护继承:派生时用“prote

3、cted”作访问控制6/* ch16_1.cpp *#include#includeclassAdvisor/导师类intnoOfMeeting;classStudent/学生类protected:charname40;intsemesterHours;/学时floataverage;/平均分7public:Student(char*pName=noname)strcpy(name,pName);average=semesterHours=0;voidaddCourse(inthours,floatgrade)average=semesterHours*average+grade;/总分sem

4、esterHours+=hours;/总修学时average/=semesterHours;/平均分intgetHours()returnsemesterHours;floatgetAverage()returnaverage;voiddisplay()coutname=name,hours=semesterHours,average=averageshow();a1.show();/2516.7多态性如何工作o一般对象的指针:o各类的指针相互独立,不能混用。o例:classAa1,*pa;classBb1,*pb;o指针pa只能指向A类对象,不能指向B类对象;指针pb只能指向B类对象,不能指

5、向A类对象。o派生类的指针与基类的指针之间相互无关。2616.7多态性如何工作2.为什么引入虚函数例如:#includeclassAprivate:intx,y;public:voidshow()coutclassA.endl;voidview()coutclassAview().endl;27classB:publicAprivate:intx,y;public:voidshow()coutclassB.endl;voidsh()coutclassBsh().endl;classC:publicBprivate:intx;public:voidshow()coutclassC.endl;vo

6、idsh()coutclassCsh().show(); / pa=&b; pa-show(); / /pa-sh(); 出错出错 pa=&c; pa-show(); / (B*)pa)-show(); / (B*)pa)-sh(); / (C*)pa)-show(); / (C*)pa)-sh(); / (C*)pa)-view(); / 执行结果:执行结果:class A. / class A. / class A. / class B. / class B sh(). / class C. / class C sh(). / class A view(). / 执行结果分析:执行结果分析

7、: 通过指针对成员函数的调用,仅通过指针对成员函数的调用,仅仅与指针本身的类型有关,与指针当仅与指针本身的类型有关,与指针当前指向的对象无关。如果要与当前对前指向的对象无关。如果要与当前对象有关,必须对指针类型进行强制转象有关,必须对指针类型进行强制转换。换。改为虚函数后执行结果:改为虚函数后执行结果:class A. / class B. / class C. / class C. / class B sh(). / class C. / class C sh(). / class A view(). / 2916.7多态性如何工作希望:o通过指针进行一种动态的指向。o即:指针指向的对象不同

8、,执行不同的重载成员函数引入虚函数:o把上例中基类A的show()函数声明成虚函数即可(函数原型前加关键字:virtual)3016.7多态性如何工作3、虚函数的定义和使用o定义:在函数原型前面加“virtual”即可o对于上面的例题,把类A的成员函数show()改成虚函数,其他不作任何改动:virtualvoidshow()coutclassA.endl;然后执行,执行结果如下:classA.classB.classC.classC.classBsh().classC.classCsh().classAview().3116.7多态性如何工作o运行时的多态性通过虚函数实现的。o虚函数:是一种

9、动态的函数重载的方式,虚函数允许函数调用与函数体之间的联系在运行时才建立。o为了指明某个成员函数具有多态性,用关键字virtual来标志其为虚函数。o在基类中声明为virtual(虚函数),其虚函数的性质自动地向下带给其子类,所以子类中的虚函数的virtual可以省略。32/* ch16_2.cpp *#includeclassBasepublic:virtualvoidfn()coutInBaseclassn;classSubClass:publicBasepublic:virtualvoidfn()coutInSubClassn;voidtest(Base&b)b.fn();intmain

10、()Basebc;SubClasssc;coutCallingtest(bc)n;test(bc);coutCallingtest(sc)n;test(sc);运行结果:运行结果:Calling test(bc)In Base ClassCalling test(sc)In SubClass33o多态性使得当要增加一个求新的事物时,只要简单地增加一个类就行了,应用程序不用作修改。o多态性让类的设计者去考虑工作的细节,而且这个细节简单到在成员函数上加一个virtual关键字。多态性使应用程序代码极大地简化,它是开启继承能力的钥匙。16.7多态性如何工作3416.8不恰当的虚函数o虚函数的原型必须

11、相同(函数的返回类型不除外),才能实现多态性,否则不管是否冠以“virtual”声明,均作为一般重载函数处理,失去虚特性(不进行迟后联编)。虚特性可以隔代传递。/* ch16_4.cpp *#include class Base public: virtual void fn(int x) cout In Base class, int x = x endl; ;35class SubClass :public Base public: virtual void fn(float x) cout In SubClass, float x = x endl; ;void test(Base& b

12、) int i =1; b.fn(i); float f =2.0; b.fn(f);int main() Base bc; SubClass sc; cout Calling test(bc)n; test(bc); cout Calling test(sc)n; test(sc);运行结果为:运行结果为: Calling test(bc) In Base class,int x=1 In Base class,int x=2 Calling test(sc) In Base class,int x=1 In Base class,int x=2调用调用Base中的中的fn函数函数36#in

13、cludeclass A private: int x,y; public: virtual void show(int a=0)coutA: endl; /声明为虚函数声明为虚函数;class B:public A public: virtual void show() coutB: endl; ;class C:public B public: void show(int b=0) coutC: endl; /虚函数虚函数;class D:public C public: void show(int b=0)cout D: show(); pa=&b; pa-show(); /执行基类执行

14、基类A的的show()函数函数 pa=&c; pa-show(); pa=&d; pa-show();运行结果运行结果: A: A: C: D: 38/* ch16_5.cpp *#includeclass Base public: virtual Base* afn() /虚函数虚函数 coutThis is Base class.n; return this; ;class SubClass:public Base public: Base* afn() /虚函数虚函数 coutWithdrawal(100.0);voidotherFunc()Savingss;Checkingc;func(&s);/合法,因为一个Savings是一个Accountfunc(&c);/合法,一个Checking也是一个Account5816.15纯虚函数的需要性o关于抽象类和纯虚函数的说明:1.抽象类只能作为其他类的基类,不能创建对象2.抽象类不能用作函数形参的类型、函数返回类型,不能进行显式类型转换。3.可以定义抽象类的指针,此指针可以指向其非抽象类的派生类的对象,以实现动态多态性。4.在抽象类的派生类中,如果没有给出基类的纯虚函数的具体定义,则该派生类仍是一个抽象类;如果在派生类的派生类中,还没有给出基类的纯虚函数的具体定义,则该派生类的派生类还是一个抽象类。59作业16.560

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号