下载此文档

虚基类与虚函数.ppt


文档分类:IT计算机 | 页数:约50页 举报非法文档有奖
1/50
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/50 下载此文档
文档列表 文档介绍
++语言中,一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类。这就导致了一些问题。为了方便说明,先介绍多继承的“类格”表示法。派生类及其基类可用一有向无环图(DAG)表示,其中的箭头表示“由派生而来”。类的DAG常称为一个“类格”。复杂类格画出来通常更容易理解。例如:2020/9/301例5-19classL{public:intnext;…};classA:publicL{};classB:publicL{};classC:publicA,publicB{public:voidf(){next=0;}};C类自己数据成员B对象数据成员L对象数据成员A对象数据成员L对象数据成员C的对象LALBC这时,next有两个赋值语句next=0;具有二义性,它是将A::next置为零,还是将B::next置为零,或者将两者都置为0,需要在函数f()++语言提供了这种描述手段。它将L说明为A和B的虚基类。LABC2020/9/303当在多条继承路径上有一个公共的基类,在这些路径中的某几条路经汇合处,这个公共基类就会产生多个实例。如果只想保存这个基类的一个实例,可以将这个公共基类说明为虚拟基类或称虚基类。它仅是简单地将关键字virtual加到基类的描述上,例如改写上述例子为例5-202020/9/304例5-20classL{public:intnext;};classA:virtualpublicL{…};classB:virtualpublicL{};classC:publicA,publicB{public:voidf(){next=0;}};这时C类对象中只有L的一个复制,因而函数C::f()中的语句next=0;没有二义性。对于类C而言,L类是B类的虚基类,而是类A的真基类;但对于类B而言,L类还是B类的真基类。例5-21或classA:publicvirtualL或classA:publicvirtualclassL{…public:intnext;…};classA:virtualpublicL{…};classB:virtualpublicL{…};classC:publicB,publicA{public:voidf(){next=0;}};此例中,对于类C而言,L类是A类的虚基类,而是类B的真基类。派生时,A,B的顺序变了一个派生类的对象的地址可以直接赋给虚基类的指针,例如:Cobj;L*ptr=&obj;这时不需要强制类型转换,并且,一个虚基类的引用可以引用一个派生类的对象,例如:Cobj2;L&ref=obj2;反之则不行,无论在强制类型转换中指定什么路径,一个虚基类的指针或引用不能转换为派生类的指针或引用。例如:C*P=(C*)(A*)ptr;将产生编译错误。2020/9/,但隐含的构造函数的调用次序有点差别。虚基类构造函数的调用次序是这样规定的:。,虚基类构造函数按它们说明的次序调用。,则遵守先调用基类构造函数,再调用派生类构造函数的规则。2020/9/308例如:classX:publicY,virtualpublicZ{}Xone;将产生如下调用次序:Z()Y()X()这里Z是X的虚基类,故先调用Z的构造函数,再调用Y的构造函数,最后才调用派生类X自己的构造函数。例5-222020/9/309#include""classbase{public:base(){cout<<"Base"<<endl;}};classbase2{public:base2(){cout<<"Base2"<<endl;}};classlevel1:publicbase2,virtualpublicbase{public:level1(){cout<<"level1"<<endl;}};classlevel2:publicbase2,virtualpublicbase{public:level2(){cout<<"level2"<<endl;}};classtoplevel:publiclevel1,virtualpubliclevel2{public:toplevel(){cout<<"toplevel"<<endl;}};base2basebase2level1level2topleveltoplevelview;voidmain(){}当建立对象view时,将产生如下调用次序:level2()level1()toplevel()

虚基类与虚函数 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数50
  • 收藏数0 收藏
  • 顶次数0
  • 上传人changjinlai
  • 文件大小1.03 MB
  • 时间2020-09-30