C++菱形继承内存布局
编译器:Visual Studio 2019
关于如何查看内存布局
B
class B
{
public:
B()
: _ib(10)
, _cb('B')
{
cout << "B()" << endl;
}
B(int ib, char cb)
: _ib(ib)
, _cb(cb)
{
cout << "B(int,char)" << endl;
}
virtual
void f()
{
cout << "B::f()" << endl;
}
virtual
void Bf()
{
cout << "B::Bf()" << endl;
}
private:
int _ib;
char _cb;
};
B内存布局图:size = 12
虚函数指针(4B)
int型数据成员(4B)
char型数据成员(4B,3B用于对齐)
1>class B size(12):
1> +---
1> 0 | {
vfptr}
1> 4 | _ib
1> 8 | _cb
1> | <alignment member> (size=3)
1> +---
1>B::$vftable@:
1> | &B_meta
1> | 0
1> 0 | &B::f
1> 1 | &B::Bf
1>B::f this adjustor: 0
1>B::Bf this adjustor: 0
B1
class B1
: virtual public B
{
public:
B1()
: _ib1(100)
, _cb1('1')
{
}
B1(int ib, char ic, int ib1, char cb1)
: B(ib, ic)
, _ib1(ib1)
, _cb1(cb1)
{
cout << "B1(int,char,int,char)" << endl;
}
virtual
void f()
{
cout << "B1::f()" << endl;
}
virtual
void f1()
{
cout << "B1::f1()" << endl;
}
virtual
void Bf1()
{