class
X
{
public
:
int
i;
virtual
void
xx(){}
};
| |
vptr
| |
data
|
Int i
|
class
A :
public
virtual
X
{
public
:
int
j;
virtual
void
aa(){}
};
| |
vptrA
| |
dataA
|
Int j;
|
vptrX
| |
dataX
|
Int i;
|
class
AA :
public
XX
{
public
:
int
j;
virtual
void
aa(){}
};
| |
vptrXX
| |
dataXX
|
Int i;
|
dataAA
|
Int j;
|
class
C :
public
virtual
A,
public
virtual
B
{
public
:
int
k;
virtual
void
cc(){}
};
| |
vptrC
| |
dataC
|
Int k;
|
vptrA
| |
dataA
|
Int j;
|
vptrX
| |
dataX
|
Int i;
|
vptrB
| |
dataB
|
double d;
|
class
CC :
public
AA,
public
BB
{
public
:
int
k;
virtual
void
cc(){}
};
| |
vptrXX
| |
dataXX
|
Int i;
|
dataAA
|
Int j;
|
vptrXX
| |
dataXX
|
Int i;
|
dataBB
|
double d;
|
#include <iostream.h>
//本程序用来测试虚继承的构造函数的默认设置
class X
{
public:
int i;
virtual void xx(){}
};
class A : public virtual X
{
public:
int j;
virtual void aa(){}
};
class B : public virtual X
{
public:
double d;
virtual void bb(){}
};
class C : public virtual A, public virtual B
{
public:
int k;
virtual void cc(){}
};
class XX
{
public:
int i;
virtual void xx(){}
};
class AA : public XX
{
public:
int j;
virtual void aa(){}
};
class BB : public XX
{
public:
double d;
virtual void bb(){}
};
class CC : public AA, public BB
{
public:
int k;
virtual void cc(){}
};
// cannot resolve location of pa->X::i at compile-time
// void foo( const A* pa ) { pa->i = 1024; }
// possible compiler transformation
void foo( const X* pa )
{
//pa->i = 1024;
cout << pa->i<<endl;
}
int main()
{
X x;
XX xx;
cout <<sizeof x << "/t"<<&x<<endl;
cout <<sizeof xx << "/t"<<&xx<<endl;
//foo(&x);
A a;
AA aa;
cout <<sizeof a << "/t"<<&a<<endl;
cout <<sizeof aa << "/t"<<&aa<<endl;
//foo(&a);
B b;
BB bb;
cout <<sizeof b << "/t"<<&b<<endl;
cout <<sizeof bb << "/t"<<&bb<<endl;
//foo(&b);
C c;
CC cc;
cout <<sizeof c << "/t"<<&c<<endl;
cout <<sizeof cc << "/t"<<&cc<<endl;
//foo(&c);
return 0;
}
对象 size mem address mem context means
x 8 0x22ff78 D44A4300 00604300 {_vptr$X = 0x434ad4, i = 4415488}
xx 8 0x22ff68 444B4300 00000000 {_vptr$XX = 0x434b44, i = 0}
a 16 0x22ff58 384A4300 05EFBE77 484A4300 38104000 {<X> = {_vptr$X = 0x434a48, i = 4198456}, _vptr$A = 0x434a38, j = 2009001733}
aa 12 0x22ff48 E44A4300 00E0FD7F 38000000 {<XX> = {_vptr$XX = 0x434ae4, i = 2147344384}, j = 56}
b 24 0x22ff28 584A4300 E3C2BF77 14B8C077 503D3D00 684A4300 08000000 {<X> = {_vptr$X = 0x434a68, i = 8}, _vptr$B = 0x434a58, d = 1.6265016828463365e-307}
bb 16 0x22ff18 F44A4300 E0FF2200 945CC077 7020BE77 {<XX> = {_vptr$XX = 0x434af4, i = 2293728}, d = 6.2171013157774407e+268}
c 40 0x22fee8 {<A> = {<X> = {_vptr$X = 0x434aa4, i = 4013313}, _vptr$A = 0x434a94, j = 2009055971}, <B> = {_vptr$B = 0x434ab8, d = -nan(0xfffff77be2088)}, _vptr$C = 0x434a80, k = 3997696}
cc 40 0x22feb8 {<AA> = {<XX> = {_vptr$XX = 0x434b04, i = 2090010352}, j = 2293504}, <BB> = {<XX> = {_vptr$XX = 0x434b18, i = 2293288}, d = 5.2835848490785469e-308}, k = 2090003992}
804A4300 00003D00 944A4300 E3C2BF77 A44A4300 013D3D00 B84A4300 945CC077 8820BE77 FFFFFFFF
044B4300 F006937C 00FF2200 18EE0100 184B4300 28FE2200 EB06937C 1CFF2200 18EE927C 7005937C
0x22ff78 : 0x22FF78 <Hex>
Address 0 - 3 4 - 7 8 - B C - F
0022FEB0 00000000 00000000 044B4300 F006937C
0022FEC0 00FF2200 18EE0100 184B4300 28FE2200
0022FED0 EB06937C 1CFF2200 18EE927C 7005937C
0022FEE0 FFFFFFFF 6D05937C 804A4300 00003D00
0022FEF0 944A4300 E3C2BF77 A44A4300 013D3D00
0022FF00 B84A4300 945CC077 8820BE77 FFFFFFFF
0022FF10 CEC3BF77 F8FE2200 F44A4300 E0FF2200
0022FF20 945CC077 7020BE77 584A4300 E3C2BF77
0022FF30 14B8C077 503D3D00 684A4300 08000000
0022FF40 ADAEC077 68203400 E44A4300 00E0FD7F
0022FF50 38000000 02000000 384A4300 05EFBE77
0022FF60 484A4300 38104000 444B4300 00000000
0022FF70 90FF2200 521D4100 D44A4300 00604300
0022FF80 00004000 AB104000 802B3D00 00000000
0022FF90 B0FF2200 2D124000 01000000 703D3D00
0022FFA0 802B3D00 06000000 083DEDBA 00E0FD7F
0022FFB0 C0FF2200 58124000 01000000 09000000
0022FFC0 F0FF2200 D76F817C 68203400 00000000
0022FFD0 00E0FD7F EDB65480 C8FF2200 58B6D985
0022FFE0 FFFFFFFF A89A837C E06F817C 00000000
0022FFF0 00000000 00000000 40124000 00000000
0x434b04 <Hex>
Address 0 - 3 4 - 7 8 - B C - F
004349F0 1C4F4300 00000000 00000000 00000000
00434A00 00000000 00000000 00000000 604F4300
00434A10 1C434300 30434300 744F4300 A04F4300
00434A20 5C434300 70434300 B44F4300 08000000
00434A30 00000000 90434300 205E4100 00000000
00434A40 F8FFFFFF 90434300 7C5F4100 10000000
00434A50 00000000 B0434300 845E4100 00000000
00434A60 F0FFFFFF B0434300 7C5F4100 18000000
00434A70 10000000 08000000 00000000 D0434300
00434A80 E85E4100 00000000 08000000 F8FFFFFF
00434A90 D0434300 205E4100 00000000 F0FFFFFF
00434AA0 D0434300 7C5F4100 00000000 F8FFFFFF
00434AB0 E8FFFFFF D0434300 845E4100 00000000
00434AC0 00000000 00000000 00000000 00000000
00434AD0 10444300 7C5F4100 00000000 00000000
00434AE0 18444300 7C604100 A45F4100 00000000
00434AF0 24444300 7C604100 EC5F4100 00000000
00434B00 30444300 7C604100 A45F4100 34604100
00434B10 F0FFFFFF 30444300 7C604100 EC5F4100
00434B20 00000000 00000000 00000000 00000000
00434B30 00000000 00000000 00000000 00000000
00434B40 70444300 7C604100 00000000 00000000
00434B50 78444300 48154000 74154000 00000000
00434B60 80444300 002A4000 202A4000 90294000
00434B70 A0294000 302B4000 802B4000 70324000
00434B80 202D4000 E02B4000 00000000 00000000
00434B90 00000000 00000000 00000000 00000000
00434BA0 8C444300 702A4000 902A4000 90294000
00434BB0 A0294000 302B4000 802B4000 C0324000
00434BC0 802D4000 002C4000 00000000 00000000