C备课讲义教程实用.pptx
《C备课讲义教程实用.pptx》由会员分享,可在线阅读,更多相关《C备课讲义教程实用.pptx(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1虚函数多态性:调用同一个函数名,可以根据需要但实现不同的功能。多态性是面向对象的程序设计的关键技术。编译时的多态性(函数重载)运行时的多态性(虚函数)多态性运行时的多态性是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定第1页/共36页2可以将一个派生类对象的地址赋给基类的指针变量。基类对象派生类对象Base b;Derive d;Base*basep;basepbasep=&b;basepbasep=&d;basep只能引用从基类继承来的成员。xShow()xShow()yShow()basep-Show();basep-
2、Show()基类指针派生类对象基类对象第2页/共36页3class Pointfloat x,y;public:Point()Point(float i,float j)x=i;y=j;float area(void)return 0.0;const float Pi=3.14159;class Circle:public Point/类Point的派生类float radius;public:Circle(float r)radius=r;float area(void)return Pi*radius*radius;void main(void)Point*pp;/基类指针,可以将派生类对
3、象的地址赋给基类指针 Circle c(5.4321);pp=&c;coutarea()Show()Base*basep;basep=&b;basep=&d;basep-Show();即指向派生类新增的成员函数需要将基类中的Show()说明为虚函数第4页/共36页5若要访问派生类中相同名字的函数,必须将基类中的同名函数定义为虚函数,这样,将不同的派生类对象的地址赋给基类的指针变量后,就可以动态地根据这种赋值语句调用不同类中的函数。第5页/共36页6class Point float x,y;public:Point()Point(float i,float j)x=i;y=j;virtual
4、float area(void)return 0.0;const float Pi=3.14159;class Circle:public Point/类Point的派生类float radius;public:Circle(float r)radius=r;float area(void)return Pi*radius*radius;void main(void)Point*pp;/基类指针,可以将派生类对象的地址赋给基类指针 Circle c(5.4321);pp=&c;coutarea()endl;/调用虚函数将area()声明为虚函数,编译器对其进行动态聚束,按照实际对象c调用了Ci
5、rcle中的函数area()。使Point类中的area()与Circle类中的area()有一个统一的接口。输出:92.7011声明为虚函数调用虚函数虚函数再定义第6页/共36页7虚函数的定义和使用 可以在程序运行时通过调用相同的函数名而实现不同功能的函数称为虚函数。定义格式为:virtual FuncName();一旦把基类的成员函数定义为虚函数,由基类所派生出来的所有派生类中,该函数均保持虚函数的特性。在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员函数。第7页/共36页8虚函数是用关键字virtual修饰的某基类中的protected或public成员函数
6、。它可以在派生类中重新定义,以形成不同版本。只有在程序的执行过程中,依据指针具体指向哪个类对象,或依据引用哪个类对象,才能确定激活哪一个版本,实现动态聚束。第8页/共36页9class Aprotected:int x;public:A()x=1000;virtual void print()cout“x=”xt;/虚函数;class B:public Aint y;public:B()y=2000;void print()cout“y=”yt;/派生虚函数;class C:public Aint z;public:C()z=3000;void print()cout“z=”zprint();
7、/调用类A的虚函数 pa=&b;pa-print();/调用类B的虚函数 pa=&c;pa-print();/调用类C的虚函数x=1000y=2000z=3000 x=1000y=2000z=3000第9页/共36页10class Base public:virtual int Set(int a,int b).;class Derive:public Basepublic:int Set(int x,int y).;class Base public:virtual int Set(int a,int b).;class Derive:public Basepublic:int Set(in
8、t x,int y=0).;int Set(int,int)是虚函数两个Set()函数参数不一致,是重载,不是虚函数第10页/共36页11关于虚函数,说明以下几点:1、当在基类中把成员函数定义为虚函数后,在其派生类中定义的虚函数必须与基类中的虚函数同名,参数的类型、顺序、参数的个数必须一一对应,函数的返回的类型也相同。若函数名相同,但参数的个数不同或者参数的类型不同时,则属于函数的重载,而不是虚函数。若函数名不同,显然这是不同的成员函数。第11页/共36页122、实现这种动态的多态性时,必须使用基类类型的指针变量或基类引用,并使该指针或引用指向不同的派生类对象,并通过调用指针或引用所指向的虚函
9、数才能实现动态的多态性。xShow()xShow()yShow()xShow()zShow()类A类B类CShow()定义为虚函数类B与类C均为类A的公有派生。A *p;B b;C c;p=&b;p-Show();p=&c;p-Show();即在程序运行时,通过赋值语句实现多态性第12页/共36页133、虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态的成员函数。4、在派生类中没有重新定义虚函数时,与一般的成员函数一样,当调用这种派生类对象的虚函数时,则调用其基类中的虚函数。5、可把析构函数定义为虚函数,但是,不能将构造函数定义为虚函数。第13页/共36页146、虚函数与一般的成员函
10、数相比较,调用时的执行速度要慢一些。为了实现多态性,在每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现的。因此,除了要编写一些通用的程序,并一定要使用虚函数才能完成其功能要求外,通常不必使用虚函数。7、一个函数如果被定义成虚函数,则不管经历多少次派生,仍将保持其虚特性,以实现“一个接口,多个形态”。第14页/共36页15虚函数的访问用基类指针或基类引用访问与用派生类对象名访问用基类指针或基类引用访问虚函数时,指向其实际派生类对象重新定义的函数。实现动态聚束。通过一个派生类对象名访问时,只能静态聚束。即由编译器在编译的时候决定调用哪个函数。第15页/共36页16class
11、 Point float x,y;public:Point()Point(float i,float j)x=i;y=j;virtual float area(void)return 0.0;/声明为虚函数;const float Pi=3.14159;class Circle:public Point/类Point的派生类float radius;public:Circle(float r)radius=r;float area(void)return Pi*radius*radius;/虚函数再定义;void main(void)Point*pp;/基类指针,可以将派生类对象的地址赋给基类
12、指针 Circle c(5.4321);coutc.area()endl;coutc.Point:area()endl;coutc.Circle:area()endl;输出:92.7011092.7011可见,利用对象名进行调用与一般非虚函数没有区别。用对象名调用area()第16页/共36页17class base0public:void v(void)coutbase0n;class base1:public base0public:virtual void v(void)coutbase1n;class A1:public base1public:void v()coutA1n;clas
13、s A2:public A1public:void v(void)coutA2n;class B1:private base1public:void v(void)coutB1n;class B2:public B1public:void v(void)coutv();A2 a2;(pb=&a2)-v();B1 b1;(pb=&b1)-v();B2 b2;(pb=&b2)-v();base0base0私有派生,在类外不能调用基类函数第17页/共36页18class base0public:void v(void)coutbase0n;class base1:public base0public
14、:virtual void v(void)coutbase1n;class A1:public base1public:void v()coutA1n;class A2:public A1public:void v(void)coutA2n;class B1:private base1public:void v(void)coutB1n;class B2:public B1public:void v(void)coutv();A2 a2;(pb=&a2)-v();A1A2第18页/共36页19下面程序的输出是 。class Aprotected:int x;public:A()x=1000;v
15、irtual void p()cout x=xn;p2();virtual void p2()coutA:p2()endl;class C:public Aint z;public:C()z=3000;void p()cout z=zn;p2();virtual void p2()coutC:p2()p();pa=&c;pa-p();x=1000z=3000C:p2()A:p2()第19页/共36页20class B0public:virtual void display()cout B0:display()n;class B1:public B0public:void display()co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 备课 讲义 教程 实用
限制150内