c++面向对象程序设计61

上传人:dja****22 文档编号:243009520 上传时间:2024-09-13 格式:PPT 页数:19 大小:125KB
返回 下载 相关 举报
c++面向对象程序设计61_第1页
第1页 / 共19页
c++面向对象程序设计61_第2页
第2页 / 共19页
c++面向对象程序设计61_第3页
第3页 / 共19页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第6章 类的其它特性(多态性与虚函数),1,多态性:,调用同一个函数名,可以根据需要但实现不同的功能。,多态性是面向对象的程序设计的关键技术。,编译时的多态性(函数重载),运行时的多态性,(虚函数),多态性,运行时的多态性是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,,根据具体的执行情况来动态地确定,多态性,2,可以将一个派生类对象的地址赋给基类的指针变量,。,基类对象,派生类对象,Base b;,Derive d;,Base *basep;,basep,basep=,basep,basep = ,basep只能引用从基类继承来的成员。,x,Show(),x,Show(),y,Show(),basep -Show();,basep-Show(),基类指针,派生类对象,基类对象,3,class Point,float 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; /,基类指针,可以将派生类对象的地址赋给基类指针,Circle c(5.4321);,pp=,coutarea ()Show(),Base *basep;,basep=,basep = ,basep -Show();,即指向派生类新增的成员函数,需要将基类中的Show()说明为虚函数,5,若要访问派生类中相同名字的函数,必须将基类中的,同名函数定义为虚函数,,这样,将不同的派生类对象的地址赋给基类的指针变量后,就可以,动态地根据这种赋值语句调用不同类中的函数,。,虚函数,6,class 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; /,基类指针,可以将派生类对象的地址赋给基类指针,Circle c(5.4321);,pp=,coutarea (),endl; /,调用虚函数,将area()声明为虚函数,编译器对其进行动态聚束,按照实际对象c,调用了Circle中的函数area(),。使Point类中的area()与Circle类中的area()有一个统一的接口。,输出:92.7011,声明为虚函数,调用虚函数,虚函数再定义,7,虚函数的定义和使用,可以在程序运行时通过调用相同的函数名而实现不同功能的函数称为虚函数。,定义格式为:,virtual, FuncName();,一旦把基类的成员函数定义为虚函数,由基类所派生出来的所有派生类中,该函数均保持虚函数的特性。,在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员函数 。,8,虚函数是用关键字virtual修饰的某基类中的protected或public成员函数。它可以在派生类中重新定义,以形成不同版本。,只有在程序的执行过程中,依据指针具体指向哪个类对象,或依据引用哪个类对象,才能确定激活哪一个版本,实现动态聚束,。,9,class A,protected: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=”zShow();,p=,p-Show();,即在程序运行时,通过赋值语句实现多态性,13,3、,虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态的成员函数。,4、在派生类中,没有重新定义虚函数,时,与一般的成员函数一样,当调用这种派生类对象的虚函数时,,则调用其基类中的虚函数,。,5、,可把析构函数定义为虚函数,但是,不能将构造函数定义为虚函数,。,14,6、虚函数与一般的成员函数相比较,,调用时的执行速度要慢一些,。为了实现多态性,在每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现的。因此,除了要编写一些通用的程序,并一定要使用虚函数才能完成其功能要求外,通常不必使用虚函数。,7、一个函数如果被定义成虚函数,则不管经历多少次派生,仍将保持其虚特性,以实现“一个接口,多个形态”。,15,虚函数的访问,用基指针访问与用对象名访问,用基指针访问虚函数时,指向其实际派生类对象重新定义的函数。实现动态聚束。,通过一个,对象名,访问时,只能静态聚束。即由编译器在编译的时候决定调用哪个函数。,16,class 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; /,基类指针,可以将派生类对象的地址赋给基类指针,Circle c(5.4321);,coutc.area()endl;,coutc.Point:area()endl;,coutc.Circle:area ()endl;,输出:92.7011,0,92.7011,可见,利用对象名进行调用与一般非虚函数没有区别。,用对象名调用area( ),17,class base0,public:void v(void)coutbase0n;,;,class base1:public base0,public:virtual void v(void) coutbase1n; ,;,class A1:public base1,public:void v()coutA1n;,;,class A2:public A1,public:void v(void)coutA2n;,;,class B1:private base1,public:void v(void)coutB1n;,;,class B2:public B1,public:void v(void)coutB2n;,;,void main(void),base0 *pb;,A1 a1;,(pb=,A2 a2;,(pb=,B1 b1;,(pb=,B2 b2;,(pb=,base0,base0,私有派生,在类外不能调用基类函数,18,class base0,public:void v(void)coutbase0n;,;,class base1:public base0,public:virtual void v(void) coutbase1n; ,;,class A1:public base1,public:void v()coutA1n;,;,class A2:public A1,public:void v(void)coutA2n;,;,class B1:private base1,public:void v(void)coutB1n;,;,class B2:public B1,public:void v(void)coutB2n;,;,void main(void),base1 *pb;,A1 a1;,(pb=,A2 a2;,(pb=,A1,A2,19,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!