多态性用同样的接口访问功能不同的函数

上传人:宝路 文档编号:50048758 上传时间:2018-08-06 格式:PPT 页数:22 大小:204.29KB
返回 下载 相关 举报
多态性用同样的接口访问功能不同的函数_第1页
第1页 / 共22页
多态性用同样的接口访问功能不同的函数_第2页
第2页 / 共22页
多态性用同样的接口访问功能不同的函数_第3页
第3页 / 共22页
多态性用同样的接口访问功能不同的函数_第4页
第4页 / 共22页
多态性用同样的接口访问功能不同的函数_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《多态性用同样的接口访问功能不同的函数》由会员分享,可在线阅读,更多相关《多态性用同样的接口访问功能不同的函数(22页珍藏版)》请在金锄头文库上搜索。

1、*1*多态性 多态性:用同样的接口访问功能不同的函数 class squared public: int squ(int) double squ(double) long squ(long) ; void main() squared value; coutarea( ); 结果调用point类的area将关键字virtual放在类中area函数的函数说明之前:virtual float area( )return 0.0;则结果调用circle类的area通过指针所引起的对普通成员函数的调用,仅仅由声明指针 的类型决定,而与当时指针实际指向什么对象无关。*5*虚函数 虚函数:为实现某种功能而

2、假设的函数,虚函数只能是类中的一个成员函数,不能是静态成员 格式:virtual 数据类型 函数名(参数) 说明: 首先在基类中声明虚函数(需要具有动态多态性的基类)在派生类中某个成员函数的参数个数、相应类型和返回类型与基 类同名的虚函数一样(即使没有virtual),则该成员函数为虚函数不允许在派生类中定义与基类仅仅返回类型不同的函数派生类中定义与基类虚函数同名但参数不同的函数,则该函数不 为虚函数。对虚函数保证在通过一个基类类型的指针调用一个虚函数时,系 统对该调用进行动态联编。对虚函数在通过一对象调用一个虚函数时,系统对该调用进行静 态联编。在调用中对虚函数使用成员名限定可强制对该函数的

3、调用使用静 态联编。*6*void main( ) circle c;circle c1.area( ); 结果调用circle类的areapoint p.area(); 结果调用circle类的areap.point:area() 结果调用point类的area 使用普通对象调用虚函数,系统以静态联编方式完 成对虚函数的调用。即用哪个类说明的对象,就调用 在那个类中定义的虚函数。为达到动态联编获得运行时多态性的效果,用指向 第一次定义虚函数的基类对象的指针(引用)来调用 虚函数虚函数*7*class B public: virtual void vf1(); virtual void vf2

4、(); 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= bp-vf1(); 调用D:vf1 bp-vf2(); 调用B:vf2 bp-vf2(5); 语法错 bp-f();

5、 调用B:f d.vf2(); 语法错 b=d; 赋值兼容 b.vf1(); 调用B:vf1 DD dd; D *dp= dp-vf4(); 调用DD:vf4 dp-vf2(); 语法错 dp-vf3(); 调用DD:vf3 bp= bp-vf2(); 调用DD:vf2*8*虚函数的访问权限 派生类中定义的虚函数的访问权限不影响对它进 行动态联编。 一个类中的虚函数说明只对派生类中重定义的函 数有影响,对它的基类中的函数无影响 class A public:void func( ) ; class B:public A public: virtual void func( ) ; class

6、C:public B public :void func( ) ;C c c.func( ); c.B:func(); A a.func(); B b.func(); b.B:func();*9*在成员函数中调用虚函数 在一个基类或派生类的成员函数中可直接调用该 类等级中的虚函数 class B:public A public:void fun3( ).fun4( );void fun4( )fun5( ); 调用自身类中虚函数调用自身类中函数thing-fun1( );由于fun1是虚函数,所以thing可指向 A类对象,也可指向B类对象thing-fun5( );由于fun5不是虚函数,而

7、是普通函数 ,总是先调用本类的成员函数(支配 规则)。采用静态联编,调用A类的 fun5();*10*构造函数和析构函数调用虚函数 在构造函数和析构函数中调用虚函数时,采用静 态联编,即调用的虚函数是自己的类或基类中定 义的函数,不是任何在派生类中重定义的虚函数执行C c时,先执行B的基类A的构造函数,再执行C的基类B 的构造函数,最后调用C的构造函数。B的构造函数执行func(),由于A类和C类中均有,应执行哪 个?应调用基类的虚函数执行c.fun()时,调用func(),因为是C对象产生的,故调用C 的函数。*11*空的虚函数 空虚函数为实现虚函数支配关系的不间断。virtual void

8、 printOn()*12*纯虚函数与抽象类 基类中不能为虚函数给出一个有意义的定 义,这时可将它说明为纯虚函数。 形式: class 类名virtual 类型 函数名(参数列表)=0 ; ;*13*说明:抽象类:至少包含有一个纯虚函数的类,只能作为基类 来派生新类,不能说明抽象类的对象。可以说明指向抽象 类的指针(引用)从一个抽象类派生的类必须提供纯虚函数的实现代码, 或在派生类中仍将它说明成纯虚函数。在抽象类中也可定义普通成员函数或虚函数,虽然不能 为抽象类声明对象,但可通过派生类对象来调用不是纯虚 函数的函数。在成员函数内可以调用纯虚函数,但在构造函数和析构 函数内不能调用纯虚函数与抽象

9、类 *14*虚析构函数 只要基类的析构函数被说明为虚函数,则派生类的析构函 数自动成为虚函数。而构造函数的调用意味着建立一个对 象,这时必须确切的知道这个对象的类型,因此无意义 虚析构函数的说明:virtual 类名() 例:class A public:A( ) virtual A( )cout class Base public: virtual int func() return 0; ; class Derived:public Base public: int func() return 100; ; void main() Derived d; Base coutfun(); p2= p2-fun();*22*#include class Base public:Base()cout “Constructor of Base.”endl;fun();virtual void fun()cout“Base:fun() called.”endl; ; class Derived:public Base public:Derived()cout“Constructor of Derived.”endl;fun();void fun()cout“Derived:fun() called.”endl; ; void main() Derived obj;

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

最新文档


当前位置:首页 > 中学教育 > 教学课件

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