




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多态性,多态性:用同样的接口访问功能不同的函数,class squared public: int squ(int) double squ(double) long squ(long) ; void main() squared value; coutvalue.squ(3); coutvalue.squ(3.5); coutvalue.squ(6L); ,通过实参的特征区别,函数联编,静态联编:指系统在编译时就决定如何实现某个动作。 特点: 要求在程序编译时就知道调用函数的全部信息。 函数调用速度很快,效率高 通过函数重载而后运算符重载实现 动态联编:指系统在运行时动态实现某个动作 特点: 要到程序运行时才能确定调用哪个函数 提供更好的灵活性、问题抽象性和程序易维护性 通过继承和虚函数实现,静态联编(通过对象的类型区别),重新在派生类中定义基类的函数,class point float area()return 0.0; ; class circle:public point float area( )return 3.14159*r*r; ; void main( ) point p; p.area( ); 调用point类的函数 circle c; c.area( ); 调用circle类的函数 ,通过对象的类型区别,运行时的多态性,指定关键字virtual,在运行时对函数动态联编,根据实际对象,调用该对象的成员函数,void main( ) point *p; circle c; p= 结果调用point类的area,将关键字virtual放在类中area函数的函数说明之前: virtual float area( )return 0.0; 则结果调用circle类的area,通过指针所引起的对普通成员函数的调用,仅仅由声明指针的类型决定,而与当时指针实际指向什么对象无关。,虚函数,虚函数:为实现某种功能而假设的函数,虚函数只能是类中的一个成员函数,不能是静态成员 格式:virtual 数据类型 函数名(参数) 说明:,首先在基类中声明虚函数(需要具有动态多态性的基类) 在派生类中某个成员函数的参数个数、相应类型和返回类型与基类同名的虚函数一样(即使没有virtual),则该成员函数为虚函数 不允许在派生类中定义与基类仅仅返回类型不同的函数 派生类中定义与基类虚函数同名但参数不同的函数,则该函数不为虚函数。 对虚函数保证在通过一个基类类型的指针调用一个虚函数时,系统对该调用进行动态联编。 对虚函数在通过一对象调用一个虚函数时,系统对该调用进行静态联编。 在调用中对虚函数使用成员名限定可强制对该函数的调用使用静态联编。,void main( ) circle c; circle 结果调用circle类的area p.point:area() 结果调用point类的area ,使用普通对象调用虚函数,系统以静态联编方式完成对虚函数的调用。即用哪个类说明的对象,就调用在那个类中定义的虚函数。 为达到动态联编获得运行时多态性的效果,用指向第一次定义虚函数的基类对象的指针(引用)来调用虚函数,虚函数,class B public: virtual void vf1(); virtual void vf2(); virtual void vf3(); void f(); ; class D:public B public: virtual void vf1(); 虚函数 void vf2(int); 普通重载 void f(); 普通重载 virtual void vf4(); 虚函数(基类相对) ; class DD:public D public: void vf4(); 虚函数 void vf2(); 虚函数 void vf3(); 虚函数,B b; D d; B *bp= 调用DD:vf2,虚函数的访问权限,派生类中定义的虚函数的访问权限不影响对它进行动态联编。 一个类中的虚函数说明只对派生类中重定义的函数有影响,对它的基类中的函数无影响,class A public: void func( ) ; class B:public A public: virtual void func( ) ; class C:public B public : void func( ) ;,C c c.func( ); c.B:func(); A ,在成员函数中调用虚函数,在一个基类或派生类的成员函数中可直接调用该类等级中的虚函数,class B:public A public: void fun3( ) .fun4( ); void fun4( ) fun5( ); ,调用自身类中虚函数,调用自身类中函数,thing-fun1( );,由于fun1是虚函数,所以thing可指向A类对象,也可指向B类对象,thing-fun5( );,由于fun5不是虚函数,而是普通函数,总是先调用本类的成员函数(支配规则)。采用静态联编,调用A类的fun5();,构造函数和析构函数调用虚函数,在构造函数和析构函数中调用虚函数时,采用静态联编,即调用的虚函数是自己的类或基类中定义的函数,不是任何在派生类中重定义的虚函数,执行C c时,先执行B的基类A的构造函数,再执行C的基类B的构造函数,最后调用C的构造函数。 B的构造函数执行func(),由于A类和C类中均有,应执行哪个?应调用基类的虚函数 执行c.fun()时,调用func(),因为是C对象产生的,故调用C的函数。,空的虚函数,空虚函数为实现虚函数支配关系的不间断。,virtual void printOn(),纯虚函数与抽象类,基类中不能为虚函数给出一个有意义的定义,这时可将它说明为纯虚函数。 形式: class 类名 virtual 类型 函数名(参数列表)=0; ;,纯虚函数与抽象类,虚析构函数,只要基类的析构函数被说明为虚函数,则派生类的析构函数自动成为虚函数。而构造函数的调用意味着建立一个对象,这时必须确切的知道这个对象的类型,因此无意义 虚析构函数的说明: virtual 类名() 例:class A public: A( ) virtual A( )cout“Destructor A”endl; ; class B:public A public: B( ) B( )cout“Destructor B”endl; ; void main() A *pa=new B; delete pa; ,class point float x,y; public: void setPoint(float i,float j)x=i;y=j; virtual float area()return 0.0; class circle:public point float radius; float area()return pi*radius*radius; public: void setRadius(float r)radius=r; ; void main() circle c; c.setRadius(2.5); point ,下列关于动态联编的描述中,错误的是( ) A)动态联编是以虚函数为基础的 B)动态联编是在运行时确定所调用的函数代码的 C)动态联编调用函数操作是指向对象的指针或对象引用 D)动态联编是在编译时确定操作函数的 关于虚函数的描述中,正确的是( ) A)虚函数是一个静态成员函数 B)虚函数是一个非成员函数 C)虚函数既可以在函数说明时定义,也可以在函数实现时定义 D)派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型,下面关于构造函数和析构函数的描述,错误的是( ) A)析构函数中调用虚函数采用静态联编 B)对虚析构函数的调用可以采用动态联编 C)当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数 D)构造函数可以声明为虚函数 关于纯虚函数和抽象类的描述中,错误的是( ) A)纯虚函数是一种特殊的虚函数,它没有具体的实现 B)抽象类是指具有纯虚函数的类 C)一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类 D)抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出,以下( )成员函数表示纯虚函数 A)virtual int vf(int); B)void vf(int)=0; C) virtual void vf()=0; D)virtual void vf(int) 在下面程序中,A、B、C、D四句编译时出现错误的是 class A /A public: /B A()func(); /C virtual void func()=0; /D ;,下列程序的运行结果如下: Bases cons. Deriveds cons. Deriveds des. Bases des. class Base public: Base()cout “Bases cons.”endl; cout “Bases des.”endl; ; class Derived:public Base public: Derived()cout “Deriveds cons.”endl; Derived()cout “Deriveds des.”endl; ; void main() Base *ptr= delete ptr;,#include class Base public: virtual int func() return 0; ; class Derived:public Base public: int func() return 100; ; void main() Derived d; Base ,class base1 public: virtual int fun() coutfun(); p2=,#include class Base public: Base()cout “Constructor of Base
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 活动与创造 唱唱练练 听辨旋律 家乡采风教学设计-2025-2026学年初中音乐七年级上册沪教版
- Silane-PEG-N3-MW-400-Silane-PEG-azide-MW-400-生命科学试剂-MCE
- 2.2 有理数乘法与除法(3)说课稿-2024-2025学年青岛版数学七年级上册
- 第8课 做做海洋生物教学设计小学美术苏少版四年级上册-苏少版
- 江苏省连云港市东海县晶都双语学校九年级化学上册 5.3 利用化学方程式的简单计算说课稿1 新人教版
- 2025年茶艺师职业技能证书考试试题含答案
- 人教版七年级历史下册第7课《辽西夏与北宋的并立》教学设计
- 2025年四川社区《网格员》高频考题汇编含答案
- 8.1.1植物的生殖 说课稿 2023-2024学年鲁科版生物八年级下册
- 《转身我发现了-》(2014年辽宁营口中考满分作文5篇)
- 热镀锌钢管技术标准
- 周三多管理学第03章管理的基本原理
- 基础生态学第4章种群及其基本特征课件
- 虚拟现实与增强现实头戴显示关键技术及应用项目
- 《电力工业企业档案分类规则0大类》(1992年修订版)
- (人教版三年级上册)数学时间的计算课件
- GB∕T 26520-2021 工业氯化钙-行业标准
- 温州医科大学《儿科学》支气管肺炎
- 常见传染病预防知识ppt-共47页课件
- 路灯基础开挖报验申请表
- 建筑材料送检指南(广东省2018完整版)
评论
0/150
提交评论