C程序设计课件:第16章 继承_第1页
C程序设计课件:第16章 继承_第2页
C程序设计课件:第16章 继承_第3页
C程序设计课件:第16章 继承_第4页
C程序设计课件:第16章 继承_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第16章 继承1本章主要内容16.1 继承的概念16.2 继承的工作方式16.3 派生类的构造16.4 继承与组合16.5 多态性16.6 多态的思考方式16.7 多态性如何工作16.8 不恰当的虚函数16.9 虚函数的限制16.10 类的冗余16.11 克服冗余带来的问题16.12 类的分解16.13 抽象类16.14 由抽象类派生具体类16.15 纯虚函数的需要性作业216.1继承的概念基类(父类): 派生新类的类派生类(子类):从基类派生而成的类基类和派生类:构成类的层次关系单继承:从一个基类派生而成的类多继承:从多个基类派生而成的类继承类别:公有继承、私有继承、保护继承访问控制:决定子

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

3、cpp *#include#includeclass Advisor /导师类 int noOfMeeting;class Student /学生类 protected: char name40; int semesterHours; / 学时 float average; /平均分7public: Student(char* pName =no name) strcpy(name, pName); average =semesterHours = 0; void addCourse(int hours, float grade) average=semesterHours*average+g

4、rade; /总分 semesterHours +=hours; /总修学时 average /=semesterHours; /平均分 int getHours()return semesterHours; float getAverage()return average; void display() cout name = name , hours = semesterHours, average = averageshow(); a1.show(); / 2516.7多态性如何工作一般对象的指针:各类的指针相互独立,不能混用。例:class Aa1,*pa; class Bb1,*pb

5、;指针pa只能指向A类对象,不能指向B类对象;指针pb只能指向B类对象,不能指向A类对象。派生类的指针与基类的指针之间相互无关。2616.7多态性如何工作2.为什么引入虚函数例如: #include class A private: int x,y; public: void show() coutclass A.endl; void view() coutclass A view().endl; ;27class B:public A private: int x,y; public: void show() coutclass B.endl; void sh() coutclass B s

6、h().endl; ;class C:public B private: int x; public: void show() coutclass C.endl; void sh() coutclass C sh().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. / clas

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

8、不同的重载成员函数引入虚函数:把上例中基类A的show()函数声明成虚函数即可(函数原型前加关键字:virtual)3016.7多态性如何工作3、虚函数的定义和使用 定义:在函数原型前面加“virtual”即可 对于上面的例题,把类A的成员函数show()改成虚函数, 其他不作任何改动: virtual void show() coutclass A.endl; 然后执行,执行结果如下: class A. class B. class C. class C. class B sh(). class C. class C sh(). class A view().3116.7多态性如何工作运行时

9、的多态性通过虚函数实现的。虚函数:是一种动态的函数重载的方式,虚函数允许函数调用与函数体之间的联系在运行时才建立。为了指明某个成员函数具有多态性,用关键字virtual来标志其为虚函数。 在基类中声明为virtual(虚函数),其虚函数的性质自动地向下带给其子类,所以子类中的虚函数的virtual可以省略。32/* ch16_2.cpp *#includeclass Base public: virtual void fn() cout In Base classn; ;class SubClass :public Base public: virtual void fn() cout In

10、SubClassn; ;void test(Base& b) b.fn(); 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 ClassCalling test(sc)In SubClass33多态性使得当要增加一个求新的事物时,只要简单地增加一个类就行了,应用程序不用作修改。多态性让类的设计者去考虑工作的细节,而且这个细节简单到在成员函数上加一个virtual关键字。多态性使应用程序代

11、码极大地简化,它是开启继承能力的钥匙。16.7 多态性如何工作3416.8不恰当的虚函数 虚函数的原型必须相同(函数的返回类型不除外),才能实现多态性,否则不管是否冠以“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) c

12、out In SubClass, float x = x endl; ;void test(Base& b) 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

13、=1 In Base class,int x=2调用Base中的fn函数36#includeclass 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: s

14、how(); pa=&b; pa-show(); /执行基类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);void otherFunc() Savings s; Checking c; func(&s); /合法,因为一个Savings是一个Account func(&c); /合法,一个Checking也是一个Account5816.15 纯虚函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论