///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 C size(16):
1> +---
1> 0 | {vbptr} 子类拥有了虚基类表
1> 4 | b
1> +---
1> +--- (virtual base A)
1> 8 | {vfptr}
1> 12 | a
1> +---
1>
1> C::$vbtable@:
1> 0 | 0
1> 1 | 8 (Cd(C+0)A)
1>
1> C::$vftable@://在使用子基类自己的虚函数的时候,如何用一个地址在父子基类中的函数中跳转
1> | -8
1> 0 | &C::af
1>
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 C size(20):
1> +---
1> 0 | {vfptr}
1> 4 | {vbptr}
1> 8 | b
1> +---
1> +--- (virtual base A)
1> 12 | {vfptr}
1> 16 | a
1> +---
1>
1> C::$vftable@C@:
1> | &C_meta
1> | 0
1> 0 | &C::bf
1>
1> C::$vbtable@:
1> 0 | -4
1> 1 | 8 (Cd(C+4)A)
1>
1> C::$vftable@A@:
1> | -12
1> 0 | &A::af
1>
1> C::bf this adjustor: 0
普通的公有继承
普通继承先初始父类,然后在初始子类,如果不是
class C size(12):
1> +---
1> | +--- (base class A)
1> 0 | | {vfptr}
1> 4 | | a
1> | +---
1> 8 | b
1> +--- //只生成一个虚函数表指针
1>
1> C::$vftable@:
1> | &C_meta
1> | 0
1> 0 | &A::af
1> 1 | &C::bf
1>
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";}//重写bf
virtual void cf(){cout<<"c";}//自己的cf
};
int main()
{
C a;
cout<<sizeof(a);
return 0;
}
//对于虚继承
class C size(28):
1> +---
1> 0 | {vfptr}
1> 4 | {vbptr}//虚基表
1> 8 | c //先创建的是的?
1> +---
1> +--- (virtual base A)
1> 12 | {vfptr}
1> 16 | a
1> +---
1> +--- (virtual base B)
1> 20 | {vfptr}
1> 24 | b
1> +---
1>
1> C::$vftable@C@: //虚函数表
1> | &C_meta
1> | 0
1> 0 | &C::cf
1>
1> C::$vbtable@: //虚基表
1> 0 | -4
1> 1 | 8 (Cd(C+4)A)
1> 2 | 16 (Cd(C+4)B)
1>
1> C::$vftable@A@:
1> | -12
1> 0 | &A::af
1>
1> C::$vftable@B@:
1> | -20
1> 0 | &C::bf
1>
1> C::bf this adjustor: 20
1> C::cf this adjustor: 0
1>
1> vbi: class offset o.vbptr o.vbte fVtorDisp
1> A 12 4 4 0
1> B 20 4 8 0
1>
*/
虚继承
最新推荐文章于 2020-12-19 22:01:25 发布