版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 派生类具有基类的所有 成员。2. 派生类的构造函数自动 执行基类的构造函数, 且基类的构造函数先执 行。基类构造函数的参 数由派生类传递。3. 派生类中可对已有的成 员进行重新定义。 4.可定义多重派生类。且 可利用虚基类使派生类 只保持一个基类的成员 拷贝。 第十讲 虚函数与多态性 8.1 多态的概念 8.2 虚函数 8.1 8.1 多态的概念多态的概念8.1 8.1 多态的概念多态的概念什么是多态性 指在一般类中定义的操作在被继承类继承后可以有不同的表现形式。例如:图形的求面积类:shape操作:求面积类:椭圆操作:求面积类:长方形操作:求面积解决的方法:用虚函数实现动态联编8.1
2、8.1 多态的概念多态的概念例1:没有用多态性的例题#includeclass A public: void print( ) cout A ; ; class B:public A /定义派生类 public: void print( ) cout print( ); /访问基类函数 p= &b; p-print( ); /希望访问派生类函数 结果:AA8.2 8.2 虚函数虚函数虚函数的定义方法在基类中,在要被定义成虚函数的函数前加关键字 virtual例如: virtual void print( );注意:1. 关键字是 virtual 2. 放在最前面,函数的类型不能忘, 如
3、 virtual void print( ): 中的 void 3. 可只在基类中的函数加 virtual,在派生类中不加, 但为了便于阅读,可在所有要声明为虚函数的 前面都加 virtual 4. 只需要在类定义文件,即头文件中的虚函数加 virtual, 在 cpp 文件中就不要再加 virtual 8.2 8.2 虚函数虚函数例2:用多态性解决例1中的问题#includeclass base public: virtual void print( ) cout “base ”; ; /定义了虚函数class first:public base /定义派生类 public: void pr
4、int( ) cout “ first ”; ; /重新定义print( ) class second:public base /定义派生类 public: void print( ) cout print( ); / 调基类成员函数 p= &ob2; / p 指向子类对象 ob2 p-print( ); / 动态联编, 调子类成员函数 p= &ob3; / p 指向子类对象 ob3 p-print( ); / 动态联编, 调子类成员函数 结果:base first second8.2 8.2 虚函数虚函数例2的相关内容总结1. 基类中的虚函数是由virtual 定义的: vi
5、rtual void print( );2. 在定义了虚函数之后, 只要定义一个基类的指针,就可 以调用子类的函数: p= &ob2; / p 指向子类对象 ob2 p-print( ); / 动态联编, 调子类成员函数3. 要实现动态联编,子类中的函数必需与基类的函数形式 一致,若在子类中对虚函数的形式进行了改变,则子类中 的函数将失去多态性(详细见下例)8.2 8.2 虚函数虚函数例3. 虚函数重载讨论#includeclass base public: virtual void f1( ) cout f1 function of base n ; /定义虚函数 virtual v
6、oid f2( ) cout f2 function of base n ; /定义虚函数 void f3( ) cout f3 function of base n ; /定义一般虚函数 ; class derive: public base public: void f1( ) cout f1 function of derive n ; /重新定义虚函数 void f2(int x ) cout f2 function of derive n ; /重新定义虚函数, /由于形式改变,失去 /虚函数功能 void f3( ) cout f1( ); /调基类函数 p-f2( ); /调基类
7、函数 p-f3( ); /调基类函数 p=&ob2; p-f1( ); /调子类函数,多态性 p-f2( ); /调基类函数,由于f2的形式改变 p-f3( ); /调基类函数,由于没有定义为虚函数结果: f1 function of base f2 function of base f3 function of base f1 function of derive f2 function of base f3 function of base8.2 8.2 虚函数虚函数例3的相关内容总结1. 在定义了虚函数之后, 只要定义一个基类的指针,就可以 调用子类的函数: p= &ob
8、2; / p 指向子类对象 ob2 p-f1( ); / 动态联编, 调子类成员函数2. 若在子类中对虚函数的形式进行了改变, 则子类中的函数 将失去多态性: p=&ob2; p-f2( ); /调基类函数,而非派生类函数(由于f2形式改变)3. 若基类中的函数没有声明为虚函数, 则子类中的函数不具 有多态性: p=&ob2; p-f3( ); /调基类函数8.2 8.2 虚函数虚函数例4. 多继承虚函数作用讨论base, 有虚函数bddrive,有多态性derive,有多态性bbderive:base对象调用: 有多态性base1对象调用:无多态性base1,无虚函数8.2
9、8.2 虚函数虚函数#includeclass base /定义基类 base public: virtual void f( ) cout base n ; ; /定义虚函数class derive: public base /定义base 的派生类 public: void f( ) cout derive n ; ; /重新定义虚函数class base1 /定义基类 base1 public: void f( ) cout base1 n ; ; /定义一般函数class bdderive: public derive /定义派生类derive的派生类 bdderive public:
10、 void f( ) cout bdderive n ; ; /重新定义虚函数class bbderive: public base, public base1 /定义激类 base 和 base1的派生类 public: void f( ) cout f( ); /调base基类函数 p=&bb; p-f( ); /调子类函数,多态性 p1=&bb; p1-f( ); /调base1基类函数,无多态性 p=&bd; p-f( ); /调子类函数,多态性 结果: base bbderive base1 bddrive8.2 8.2 虚函数虚函数例4的相关内容总结1. 在
11、定义了虚函数之后, 其多态性在派生类中得到延伸。2. 在多重继承中,若某一基类无虚函数定义,则由该基 类创建的对象不具有多态性: base1 *p; /基类 base1中没有定义 f( )为虚函数 p=&bb; p-f( ); /调基类函数, 无多态性8.2 8.2 虚函数虚函数例5. 多态性的应用: 考虑哺乳动物类mammal,它有派生类狗 dog 和猫 cat, 基类中有虚函数 speak( ),类层次如下图。哺乳动物mammal:虚函数 speak( )猫: speak( ): 多态狗:speak( ): 多态8.2 8.2 虚函数虚函数/基类和派生类定义class mammal
12、 public: virtual void speak( ) cout Mammal speak. n ; ;class dog: public mammal public: void speak( ) cout Woof!n ; ;class cat: public mammal public: void speak( ) cout Meow!n ; ;8.2 8.2 虚函数虚函数void main( ) mammal *p; /定义基类对象的指针 int choice; do /循环体 cout enter your choice ; cout choice; switch(choice)
13、 case 1: p=new cat; break; case 2: p=new dog; break; default: p=new mammal; p-speak( ); while (choice!=0); /循环体结束8.2 8.2 虚函数虚函数结果: enter your choice(0:exit,1:cat,2:dog): 1 Meow! enter your choice(0:exit,1:cat,2:dog): 2 Woof! enter your choice(0:exit,1:cat,2:dog): 1 Meow! enter your choice(0:exit,1:c
14、at,2:dog): 3 Mammal speak! enter your choice(0:exit,1:cat,2:dog): 0 Press any key to continue8.2 8.2 虚函数虚函数例5的相关内容总结1. 动态联编的体现, 在程序中 p-speak( ); 在编译时不知道要调用哪一个speak(), 只有在choice输入后才决定.由于定义 了虚函数,系统会决定调用哪一个函数.2. 应用dowhile构造一个多选择的循环体. 具有实际应用意义.8.2 8.2 虚函数虚函数例6. 多态性的应用: 计算图形面积,其中shape为一般有关图 形的特征描述,是基类。类c
15、ircle代表“圆”, square代 表“正方形”。shape:虚函数 area()square: area( ): 多态circle: area( ): 多态8.2 8.2 虚函数虚函数例6. 计算图形面积class shape public: virtual float area( ) return 0.0; ;class circle: public shape public: circle(float a=0) r=a; float area( ) return 3.14*r*r; private: float r; ;class square: public shape public: square(float b=0) s=b; float area( ) return s*s; private: float s; ;8.2 8.2 虚函数虚函数#includevoid main( ) shape *p; /定义基类指针 circle c1(1.0); /创建对象 c1 square s1(2.0); /创建对象 s1 p=&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44034-2024铁矿石矿浆的取样方法
- 冀教版四年级上册数学第七单元 垂线和平行线 测试卷【a卷】
- 2024年沙石供应商指定合同2篇
- 长沙房屋租赁合同(31篇)
- 水果收购合同5篇
- 广东省佛山市2023-2024学年高一上学期期末考试化学试题(含答案)
- 让数学变得快乐大班学习新方式
- 设计合同补充协议的进度安排
- 诚信交易的基本原则
- 购车合同范本样本样本示例
- 昆虫记中33种昆虫简介
- 2024年宪法知识竞赛题库及完整答案【易错题】
- 钢结构安装临时支撑专项方案
- 苏教译林版四年级下学期英语第五单元测试卷(附答案)
- 医疗器械售后服务能力证明资料模板
- 幼儿园游戏化教学
- 轴芯加工工艺过程
- DL-T 5605-2021太阳能热发电厂蒸汽发生系统设计规范-PDF解密
- 2024年《中国税制》知识考试复习题库(含答案)
- Unit+2+Bridging+Cultures+Reading+and+Thinking 高中英语人教版(2019)选择性必修第二册
- 智能药膏的开发与评价
评论
0/150
提交评论