虚继承

来源:互联网 发布:24网络交换机怎么连接 编辑:程序博客网 时间:2024/05/21 05:07
///d1reportSingleClassLayout**#include <iostream>using namespace std;/*class A{int a;public:virtual void af(){cout<<"a";}};class C:virtual public A{int b;public:void af(){cout<<"b";}};int main(){C b;b.af();A s;s = b;s.af();}虚继承,若是子类中的虚函数是重写了父类的虚函数,没有重新创建新的虚函数,则就生成一个虚函数表初始内存时先对子类进行初始,然后才对父类?1> class Csize(16):1>  +---1>   0| {vbptr} 子类拥有了虚基类表1>   4| b1>  +---1>  +--- (virtual base A)1>   8| {vfptr}1>  12| a1>  +---1>  1>  C::$vbtable@:1>   0| 01>   1| 8 (Cd(C+0)A)1>  1>  C::$vftable@://在使用子基类自己的虚函数的时候,如何用一个地址在父子基类中的函数中跳转1>  | -81>   0| &C::af1>  1>  C::af this adjustor: 8*//*class A{int a;virtual void af(){cout<<"a";}};class C:virtual public A{int b;virtual void bf(){cout<<"b";}};int main(){C b;}虚继承:如果子基类中出现与父基类不同的虚函数,则子基类拥有自己的虚函数表虚函数表和虚拟类表的排序1>class Csize(20):1>  +---1>   0| {vfptr}1>   4| {vbptr}1>   8| b1>  +---1>  +--- (virtual base A)1>  12| {vfptr}1>  16| a1>  +---1>  1>  C::$vftable@C@:1>  | &C_meta1>  |  01>   0| &C::bf1>  1>  C::$vbtable@:1>   0| -41>   1| 8 (Cd(C+4)A)1>  1>  C::$vftable@A@:1>  | -121>   0| &A::af1>  1>  C::bf this adjustor: 0普通的公有继承普通继承先初始父类,然后在初始子类,如果不是class Csize(12):1>  +---1>  | +--- (base class A)1>   0| | {vfptr}1>   4| | a1>  | +---1>   8| b1>  +--- //只生成一个虚函数表指针1>  1>  C::$vftable@:1>  | &C_meta1>  |  01>   0| &A::af1>   1| &C::bf1>  1>  C::bf this adjustor: 0*//*class A{int a;virtual void af(){cout<<"a";}};class B{int b;virtual void bf(){cout<<"b";}};class C:virtual A,virtual B{int c;void bf(){cout<<"niaho";}//重写bfvirtual void cf(){cout<<"c";}//自己的cf};int main(){C a;cout<<sizeof(a);return 0;}//对于虚继承class Csize(28):1>  +---1>   0| {vfptr}1>   4| {vbptr}//虚基表1>   8| c//先创建的是的?1>  +---1>  +--- (virtual base A)1>  12| {vfptr}1>  16| a1>  +---1>  +--- (virtual base B)1>  20| {vfptr}1>  24| b1>  +---1>  1>  C::$vftable@C@: //虚函数表1>  | &C_meta1>  |  01>   0| &C::cf1>  1>  C::$vbtable@:  //虚基表1>   0| -41>   1| 8 (Cd(C+4)A)1>   2| 16 (Cd(C+4)B)1>  1>  C::$vftable@A@:1>  | -121>   0| &A::af1>  1>  C::$vftable@B@:1>  | -201>   0| &C::bf1>  1>  C::bf this adjustor: 201>  C::cf this adjustor: 01>  1>  vbi:   class  offset o.vbptr  o.vbte fVtorDisp1>                 A      12       4       4 01>                 B      20       4       8 01>  */

0 0