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

上传人:dja****22 文档编号:243014410 上传时间:2024-09-13 格式:PPT 页数:16 大小:119.50KB
返回 下载 相关 举报
c++面向对象程序设计62_第1页
第1页 / 共16页
c++面向对象程序设计62_第2页
第2页 / 共16页
c++面向对象程序设计62_第3页
第3页 / 共16页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第6章 类的其它特性(多态性与虚函数),1,纯虚函数,在基类中不对虚函数给出有意义的实现,,,它只是在派生类中有具体的意义。这时基类中的虚函数只是一个入口,具体的目的地由不同的派生类中的对象决定。这个虚函数称为,纯虚函数,。,class ,virtual (),=0,;,.,;,2,class A,protected:int x;,public:A()x =1000;,virtual void print()=0; /定义纯虚函数,;,class B:public A /派生类,private: int y;,public:B() y=2000;,void print()cout “y=”yn;/重新定义纯虚函数,;,class C:public A /派生类,int z;,public:C()z=3000;,void print()cout “z=”zn;/重新定义纯虚函数,;,void main(void ), A *pa;B b; C c;,pa=,A a; pa=,y=2000,z=3000,抽象类,不能定义抽象类的对象,3,1、在定义纯虚函数时,不能定义虚函数的实现部分。,2、把函数名赋于0,本质上是将指向函数体的指针值赋为初值0。与定义空函数不一样,空函数的函数体为空,即调用该函数时,不执行任何动作。,在没有重新定义这种纯虚函数之前,是不能调用这种函数的。,4,3、,把至少包含一个纯虚函数的类,称为抽象类。这种类只能作为派生类的基类,不能用来说明这种类的对象,。,其理由是明显的:因为虚函数没有实现部分,所以不能产生对象。但可以定义指向抽象类的指针,即指向这种基类的指针。当用这种基类指针指向其派生类的对象时,,必须在派生类中,重载,纯虚函数,否则会产生程序的运行错误。,5,4、,在以抽象类作为基类的派生类中必须有纯虚函数的实现部分,即必须有重载纯虚函数的函数体。否则,这样的派生类也是不能产生对象的。,综上所述,可把纯虚函数归结为:,抽象类的唯一用途是为派生类提供基类,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。,6,虚基类,多基派生中的多条路径具有公共基类时,在这条路径的汇合处就会因对公共基类产生多个拷贝而产生同名函数调用的二义性。,解决这个问题的办法就是把,公共基类定义为虚基类,,使由它派生的多条路径的汇聚处只产生一个拷贝。,class Base ;,class A : public Base ;,class B: public Base ;,class C: public A, public B ;,类C中继承了两个类Base,即有两个类Base的实现部分,在调用时产生了二义性。,7,用虚基类进行多重派生时,,若虚基类没有缺省的构造函数,,则在每一个派生类的构造函数中,都必须有对虚基类构造函数的调用,(且首先调用)。,由虚基类派生出的对象初始化时,,直接调用,虚基类的构造函数。因此,若将一个类定义为虚基类,则一定有正确的构造函数可供所有派生类调用。,8,class base,public:,virtual void a()couta() in basen;,virtual void b()coutb() in basen;,virtual void c()coutc() in basen;,virtual void d()coutd() in basen;,virtual void e()coute() in basen;,virtual void f()coutf() in basen;,;,class A:public base,public:,virtual void a()couta() in An;,virtual void b()coutb() in An;,virtual void f()coutf() in An;,;,class B:public base,public:,virtual void a()couta() in Bn;,virtual void c()coutc() in Bn;,;,class C:public A,public B,public:,virtual void a()couta() in Cn;,virtual void d()couta();,pa-b();,pa-c();,pa-d();,pa-e();,pa-f();,将类C的地址赋值时产生歧义,9,a( ),b( ),c( ),d( ),e( ),f( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),b( ),f( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),c( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),b( ),f( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),c( ),base,A,B,C,a( ),d( ),A,B,10,class base,public:,virtual void a()couta() in basen;,virtual void b()coutb() in basen;,virtual void c()coutc() in basen;,virtual void d()coutd() in basen;,virtual void e()coute() in basen;,virtual void f()coutf() in basen;,;,class A:public base,public:,virtual void a()couta() in An;,virtual void b()coutb() in An;,virtual void f()coutf() in An;,;,class B:public base,public:,virtual void a()couta() in Bn;,virtual void c()coutc() in Bn;,;,class C:public A,public B,public:,virtual void a()couta() in Cn;,virtual void d()couta();,pa-b();,pa-c();,pa-d();,pa-e();,pa-f();,将类C的地址赋值时产生歧义,类C中有两个base,只有一个A,a() in C,b() in A,c() in base,d() in C,e() in base,f() in A,为避免这种情况,将base定义为虚基类。,11,class base,public:,virtual,void a()couta() in basen;,virtual,void b()coutb() in basen;,virtual,void c()coutc() in basen;,virtual,void d()coutd() in basen;,virtual,void e()coute() in basen;,virtual,void f()coutf() in basen;,;,class A:,virtual,public base,public:,virtual void a()couta() in An;,virtual void b()coutb() in An;,virtual void f()coutf() in An;,;,class B:,virtual,public base,public:,virtual void a()couta() in Bn;,virtual void c()coutc() in Bn;,;,class C:public A,public B,public:,virtual void a()couta() in Cn;,virtual void d()couta();,pa-b();,pa-c();,pa-d();,pa-e();,pa-f();,12,a( ),b( ),c( ),d( ),e( ),f( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),b( ),f( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),c( ),a( ),b( ),c( ),d( ),e( ),f( ),a( ),b( ),f( ),a( ),c( ),base,A,B,C,a( ),d( ),A,B,13,class base,public:,virtual,void a()couta() in basen;,virtual,void b()coutb() in basen;,virtual,void c()coutc() in basen;,virtual,void d()coutd() in basen;,virtual,void e()coute() in basen;,virtual,void f()coutf() in basen;,;,class A:,virtual,public base,public:,virtual void a()couta() in An;,virtual void b()coutb() in An;,virtual void f()coutf() in An;,;,class B:,virtual,public base,public:,virtual void a()couta() in Bn;,virtual void c()coutc() in Bn;,;,class C:public A,public B,public:,virtual void a()couta() in Cn;,virtual void d()couta();,pa-b();,pa-c();,pa-d();,pa-e();,pa-f();,类C中只有一个base,a() in C,b() in A,c() in B,d() in C,e() in base,f() in A,14,class base,public:,void a()couta() in basen;,void b()coutb() in basen;,void c()coutc() in basen;,void d()coutd() in basen;,void e()coute() in basen;,void f()coutf() in basen;,;,class A:,virtual,public base,public:,void a()couta() in An;,void b()coutb() in An;,void f()coutf() in An;,;,class B:,virtual,public base,public:,void a()couta() in Bn;,void c()coutc() in Bn;,;,class C:public A,public B,public:,void a()couta() in Cn;,void d()couta();,pa-b();,pa-c();,pa-d();,pa-e();,pa-f();,类C中只有一个base,a() in base,b() in base,c() in base,d() in base,e() in base,f() in base,15,下面程序的输出是,。,class A,protected:int x;,public:A()x =1000;,virtual void p()cout x=xn; p2();,virtual void p2()coutA:p2()endl;,;,class C:public A,int z;,public:C()z=3000;,void p()cout z=zn; p2();,virtual void p2()coutC:p2()p();,pa=,16,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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