多态性与虚函数精.ppt
《多态性与虚函数精.ppt》由会员分享,可在线阅读,更多相关《多态性与虚函数精.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、多态性与虚函数1第1页,本讲稿共25页第6章 多态性与虚函数2第2页,本讲稿共25页6.1 多态性的概念多态性的概念6.2 一个典型的例子一个典型的例子6.3 虚函数虚函数6.4 纯虚函数与抽象类纯虚函数与抽象类3第3页,本讲稿共25页6.1 多态性的概念多态性的概念多多多多态态态态性性性性:调调调调用用用用同同同同一一一一个个个个函函函函数数数数名名名名,可可可可以以以以根根根根据据据据需需需需要要要要实实实实现现现现不同的功能。不同的功能。不同的功能。不同的功能。多态性是面向对象程序设计的关键技术。多态性是面向对象程序设计的关键技术。多态性是面向对象程序设计的关键技术。多态性是面向对象程序
2、设计的关键技术。编译时的多态性(函数重载)编译时的多态性(函数重载)编译时的多态性(函数重载)编译时的多态性(函数重载)运行时的多态性运行时的多态性运行时的多态性运行时的多态性(虚函数)(虚函数)(虚函数)(虚函数)多态性多态性多态性多态性运运运运行行行行时时时时的的的的多多多多态态态态性性性性是是是是指指指指在在在在程程程程序序序序执执执执行行行行之之之之前前前前,根根根根据据据据函函函函数数数数名名名名和和和和参参参参数数数数无无无无法法法法确确确确定定定定应应应应该该该该调调调调用用用用哪哪哪哪一一一一个个个个函函函函数数数数,必必必必须须须须在在在在程程程程序序序序的执行过程中,的执行
3、过程中,的执行过程中,的执行过程中,根据具体的执行情况来动态地确定。根据具体的执行情况来动态地确定。根据具体的执行情况来动态地确定。根据具体的执行情况来动态地确定。4第4页,本讲稿共25页可可可可以以以以将将将将一一一一个个个个派派派派生生生生类类类类对对对对象象象象的的的的地地地地址址址址赋赋赋赋给给给给基基基基类类类类的的的的指指指指针针针针变量变量变量变量。基类对象基类对象基类对象基类对象派生类对象派生类对象派生类对象派生类对象Base b;Base b;Derive d;Derive d;Base*basep;Base*basep;basepbasep=&b;basep=&b;base
4、pbasep=&d;basep=&d;basepbasep只能引用从基类只能引用从基类只能引用从基类只能引用从基类继承来的成员。继承来的成员。继承来的成员。继承来的成员。x xShow(Show()x xShow(Show()y yShow(Show()basep-Show();basep-Show();basep-Showbasep-Show()()基类指针基类指针派生类对象派生类对象基类对象基类对象5第5页,本讲稿共25页class Point class Point float x,y;float x,y;public:Point()public:Point()Point(float i
5、,float j)x=i;y=j;Point(float i,float j)x=i;y=j;float area(void)return 0.0;float area(void)return 0.0;const float Pi=3.14159F;const float Pi=3.14159F;class Circle:public Point /class Circle:public Point /类类类类PointPoint的派生类的派生类的派生类的派生类 float radius;float radius;public:Circle(float r)radius=r;public:Ci
6、rcle(float r)radius=r;float area(void)return Pi*radius*radius;float area(void)return Pi*radius*radius;void main(void)void main(void)Point*pp;/Point*pp;/基类指针,可将派生类对象的地址赋给基类指针基类指针,可将派生类对象的地址赋给基类指针基类指针,可将派生类对象的地址赋给基类指针基类指针,可将派生类对象的地址赋给基类指针 Circle c(5.4321);pp=&c;Circle c(5.4321);pp=&c;coutarea()endl;/c
7、outarea()Show()basep-Show()Base*basep;Base*basep;basep=&b;basep=&b;basep=&d;basep=&d;basep-Show();basep-Show();要指向派生类新增的成员函数要指向派生类新增的成员函数要指向派生类新增的成员函数要指向派生类新增的成员函数需要将基类中的需要将基类中的需要将基类中的需要将基类中的Show()Show()说明为虚函数说明为虚函数说明为虚函数说明为虚函数7第7页,本讲稿共25页若若若若要要要要访访访访问问问问派派派派生生生生类类类类中中中中相相相相同同同同名名名名字字字字的的的的函函函函数数数数,
8、必必必必须须须须将将将将基基基基类类类类中中中中的的的的同同同同名名名名函函函函数数数数定定定定义义义义为为为为虚虚虚虚函函函函数数数数,这这这这样样样样,将将将将不不不不同同同同的的的的派派派派生生生生类类类类对对对对象象象象的的的的地地地地址址址址赋赋赋赋给给给给基基基基类类类类的的的的指指指指针针针针变变变变量量量量后后后后,就就就就可可可可以以以以动动动动态态态态地地地地根根根根据这种赋值语句调用不同类中的函数据这种赋值语句调用不同类中的函数据这种赋值语句调用不同类中的函数据这种赋值语句调用不同类中的函数。6.2 一个典型的例子一个典型的例子例例例例6.1 6.1 先先先先建建建建立立
9、立立一一一一个个个个PointPoint类类类类,包包包包含含含含数数数数据据据据成成成成员员员员x,x,y y。以以以以它它它它为为为为基基基基类类类类,派派派派生生生生出出出出一一一一个个个个CircleCircle类类类类,增增增增加加加加数数数数据据据据成成成成员员员员r r,再再再再以以以以CircleCircle类类类类为为为为直直直直接接接接基基基基类类类类,派派派派生生生生出出出出一一一一个个个个CylinderCylinder类类类类,再再再再增增增增加加加加数数数数据据据据成成成成员员员员h h。要要要要求求求求编编编编写写写写程程程程序序序序,重重重重载载载载运运运运算算
10、算算符符符符“”,使之能用于输出以上类的对象。,使之能用于输出以上类的对象。,使之能用于输出以上类的对象。,使之能用于输出以上类的对象。(1 1 2 2 3 3)8第8页,本讲稿共25页6.3 虚函数虚函数6.3.1 虚函数的作用虚函数的作用允允允允许许许许在在在在派派派派生生生生类类类类中中中中重重重重新新新新定定定定义义义义与与与与基基基基类类类类同同同同名名名名的的的的函函函函数数数数,并并并并且且且且可可可可以以以以通通通通过过过过基基基基类类类类的的的的指指指指针针针针去去去去访访访访问问问问基基基基类类类类和和和和派派派派生生生生类类类类中中中中的的的的同同同同名名名名函数。函数。
11、函数。函数。例例例例6.2 6.2 基类与派生类中有同名函数。(基类与派生类中有同名函数。(基类与派生类中有同名函数。(基类与派生类中有同名函数。(1 1 2 2)虚函数的使用方法:虚函数的使用方法:虚函数的使用方法:虚函数的使用方法:(1)(1)在基类中用在基类中用在基类中用在基类中用virtualvirtual声明成员函数为虚函数。声明成员函数为虚函数。声明成员函数为虚函数。声明成员函数为虚函数。(2)(2)在在在在派派派派生生生生类类类类中中中中重重重重新新新新定定定定义义义义此此此此函函函函数数数数,要要要要求求求求函函函函数数数数名名名名、函函函函数数数数类类类类型型型型、函函函函数
12、数数数参参参参数数数数个个个个数数数数和和和和类类类类型型型型全全全全部部部部与与与与基基基基类类类类的的的的虚虚虚虚函函函函数数数数相相相相同同同同,并根据派生类的需要重新定义函数体。,并根据派生类的需要重新定义函数体。,并根据派生类的需要重新定义函数体。,并根据派生类的需要重新定义函数体。9第9页,本讲稿共25页当当当当一一一一个个个个成成成成员员员员函函函函数数数数被被被被声声声声明明明明为为为为虚虚虚虚函函函函数数数数后后后后,其其其其派派派派生生生生类类类类中中中中的同名函数都自动成为虚函数。的同名函数都自动成为虚函数。的同名函数都自动成为虚函数。的同名函数都自动成为虚函数。(3)(
13、3)定定定定义义义义一一一一个个个个指指指指向向向向基基基基类类类类的的的的指指指指针针针针变变变变量量量量,并并并并使使使使它它它它指指指指向向向向同同同同一类簇中的某一个对象。一类簇中的某一个对象。一类簇中的某一个对象。一类簇中的某一个对象。(4)(4)通通通通过过过过该该该该指指指指针针针针变变变变量量量量调调调调用用用用此此此此虚虚虚虚函函函函数数数数,此此此此时时时时调调调调用用用用的的的的就就就就是指针变量指向对象的同名函数。是指针变量指向对象的同名函数。是指针变量指向对象的同名函数。是指针变量指向对象的同名函数。6.3.2 静态关联与动态关联静态关联与动态关联函函函函数数数数重重
14、重重载载载载和和和和通通通通过过过过对对对对象象象象名名名名调调调调用用用用的的的的虚虚虚虚函函函函数数数数,在在在在编编编编译译译译时时时时即即即即可可可可确确确确定定定定其其其其调调调调用用用用的的的的虚虚虚虚函函函函数数数数属属属属于于于于哪哪哪哪一一一一个个个个类类类类,该该该该过过过过程程程程称称称称为为为为静态关联静态关联静态关联静态关联(static bindingstatic binding)。)。)。)。在在在在运运运运行行行行阶阶阶阶段段段段把把把把虚虚虚虚函函函函数数数数和和和和类类类类对对对对象象象象“绑绑绑绑定定定定”在在在在一一一一起起起起的的的的过程称为过程称为过
15、程称为过程称为动态关联动态关联动态关联动态关联(dynamic bindingdynamic binding)。)。)。)。10第10页,本讲稿共25页可可可可以以以以在在在在程程程程序序序序运运运运行行行行时时时时通通通通过过过过调调调调用用用用相相相相同同同同的的的的函函函函数数数数名名名名而而而而实实实实现现现现不不不不同功能的函数称为虚函数。同功能的函数称为虚函数。同功能的函数称为虚函数。同功能的函数称为虚函数。定义格式为:定义格式为:定义格式为:定义格式为:virtual virtual FuncName();FuncName();一一一一旦旦旦旦把把把把基基基基类类类类的的的的成成
16、成成员员员员函函函函数数数数定定定定义义义义为为为为虚虚虚虚函函函函数数数数,由由由由基基基基类类类类所所所所派派派派生出来的所有派生类中,该函数均保持虚函数的特性。生出来的所有派生类中,该函数均保持虚函数的特性。生出来的所有派生类中,该函数均保持虚函数的特性。生出来的所有派生类中,该函数均保持虚函数的特性。在在在在派派派派生生生生类类类类中中中中重重重重新新新新定定定定义义义义基基基基类类类类中中中中的的的的虚虚虚虚函函函函数数数数时时时时,可可可可以以以以不不不不用用用用关键字关键字关键字关键字virtualvirtual来修饰这个成员函数来修饰这个成员函数来修饰这个成员函数来修饰这个成员
17、函数 。虚虚虚虚函函函函数数数数是是是是用用用用virtualvirtual修修修修饰饰饰饰的的的的某某某某基基基基类类类类中中中中的的的的protectedprotected或或或或publicpublic成成成成员员员员函函函函数数数数。它它它它可可可可以以以以在在在在派派派派生生生生类类类类中中中中重重重重新新新新定定定定义义义义,以以以以形形形形成成成成不不不不同同同同版版版版本本本本。只只只只有有有有在在在在程程程程序序序序的的的的执执执执行行行行过过过过程程程程中中中中,依依依依据据据据指指指指针针针针具具具具体体体体指指指指向向向向哪哪哪哪个个个个类类类类的的的的对对对对象象象象
18、,才才才才能能能能确确确确定定定定激激激激活活活活哪哪哪哪一一一一个个个个版版版版本本本本,实实实实现现现现动动动动态态态态关联关联关联关联。11第11页,本讲稿共25页class A class A protected:int x;protected:int x;public:A()x=1000;public:A()x=1000;virtual void print()cout x=xt;/virtual void print()cout x=xt;/虚函数虚函数虚函数虚函数;class B:public A int y;class B:public A int y;public:publi
19、c:B()y=2000;B()y=2000;void print()cout y=yt;/void print()cout y=yt;/派生虚函数派生虚函数派生虚函数派生虚函数;class C:public A int z;class C:public A int z;public:C()z=3000;public:C()z=3000;void print()cout z=zn;/void print()cout z=zprint();/pa=&a;pa-print();/调用类调用类调用类调用类A A的虚函数的虚函数的虚函数的虚函数 pa=&b;pa-print();/pa=&b;pa-pr
20、int();/调用类调用类调用类调用类B B的虚函数的虚函数的虚函数的虚函数 pa=&c;pa-print();/pa=&c;pa-print();/调用类调用类调用类调用类C C的虚函数的虚函数的虚函数的虚函数 12第12页,本讲稿共25页class Base class Base public:public:virtual int Set(virtual int Set(int a,int bint a,int b).;class Derive:public Base class Derive:public Base public:public:int Set(int Set(int x,
21、int yint x,int y).;class Base class Base public:public:virtual int Set(virtual int Set(int a,int bint a,int b).;class Derive:public Base class Derive:public Base public:public:int Set(int Set(int x,int y=0int x,int y=0).;int Set(int,int)int Set(int,int)是虚函数是虚函数两个两个Set()Set()函数参数不一致,是重载,不是虚函数函数参数不一致,
22、是重载,不是虚函数13第13页,本讲稿共25页关于虚函数,说明以下几点:关于虚函数,说明以下几点:关于虚函数,说明以下几点:关于虚函数,说明以下几点:1 1、当当当当在在在在基基基基类类类类中中中中把把把把成成成成员员员员函函函函数数数数定定定定义义义义为为为为虚虚虚虚函函函函数数数数后后后后,在在在在其其其其派派派派生生生生类类类类中中中中定定定定义义义义的的的的虚虚虚虚函函函函数数数数必必必必须须须须与与与与基基基基类类类类中中中中的的的的虚虚虚虚函函函函数数数数同同同同名名名名,参参参参数数数数的的的的类类类类型型型型、顺顺顺顺序序序序、参参参参数数数数的的的的个个个个数数数数必必必必须
23、须须须一一一一一一一一对对对对应应应应,函函函函数数数数返返返返回回回回值值值值的的的的类类类类型型型型也也也也要要要要相相相相同同同同。若若若若函函函函数数数数名名名名相相相相同同同同,但但但但参参参参数数数数的的的的个个个个数数数数不不不不同同同同或或或或者者者者参参参参数数数数的的的的类类类类型型型型不不不不同同同同时时时时,则则则则属属属属于于于于函函函函数数数数的的的的重重重重载载载载,而而而而不不不不是是是是虚虚虚虚函数。若函数名不同,显然这是不同的成员函数。函数。若函数名不同,显然这是不同的成员函数。函数。若函数名不同,显然这是不同的成员函数。函数。若函数名不同,显然这是不同的成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多态性 函数
限制150内