64,651
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
/*
* 带有数据成员的基类
*/
struct CBaseClass
{
CBaseClass( size_t i ) : m_val( i ) {}
size_t m_val;
};
/*
* 虚拟继承体系
*/
struct CSubClassV1 : public virtual CBaseClass
{
CSubClassV1( size_t i ) : CBaseClass( i ) {}
};
struct CSubClassV2 : public virtual CBaseClass
{
CSubClassV2( size_t i ) : CBaseClass( i ) {}
};
struct CSubClassV3 : public virtual CBaseClass
{
CSubClassV3( size_t i ) : CBaseClass( i ) {}
};
struct CDiamondClass1 : public CSubClassV1, public CSubClassV2
{
CDiamondClass1( size_t i ) : CBaseClass( i ), CSubClassV1( i ), CSubClassV2( i ) {}
};
struct CDiamondClass2 : public CSubClassV1, public CSubClassV2, public CSubClassV3
{
CDiamondClass2( size_t i ) : CBaseClass( i ), CSubClassV1( i ), CSubClassV2( i ), CSubClassV3(i) {}
};
struct CDiamondSubClass1 : public CDiamondClass1
{
CDiamondSubClass1( size_t i ) : CBaseClass( i ), CDiamondClass1( i ) {}
};
struct CDiamondSubClass2 : public CDiamondClass1, public CDiamondClass2
{
CDiamondSubClass2( size_t i ) : CBaseClass( i ), CDiamondClass1( i ), CDiamondClass2(i) {}
};
int main( int argc, char *argv[] )
{
/*
* 类体系中的尺寸.
*/
std::cout << "sizeof( CBaseClass1 ) = " << sizeof( CBaseClass ) << std::endl;
std::cout << std::endl;
std::cout << "sizeof( CSubClassV1 ) = " << sizeof( CSubClassV1 ) << std::endl;
std::cout << "sizeof( CSubClassV2 ) = " << sizeof( CSubClassV2 ) << std::endl;
std::cout << "sizeof( CDiamondClass1 ) = " << sizeof( CDiamondClass1 ) << std::endl;
std::cout << "sizeof( CDiamondClass2 ) = " << sizeof( CDiamondClass2 ) << std::endl;
std::cout << "sizeof( CDiamondSubClass1 ) = " << sizeof( CDiamondSubClass1 ) << std::endl;
std::cout << "sizeof( CDiamondSubClass2 ) = " << sizeof( CDiamondSubClass2 ) << std::endl;
std::cout << std::endl;
return 0;
}
class CBaseClass size(8):
+---
0 | m_val
+---
class CSubClassV1 size(16):
+---
0 | {vbptr}
+---
+--- (virtual base CBaseClass)
8 | m_val
+---
class CSubClassV2 size(16):
+---
0 | {vbptr}
+---
+--- (virtual base CBaseClass)
8 | m_val
+---
class CSubClassV3 size(16):
+---
0 | {vbptr}
+---
+--- (virtual base CBaseClass)
8 | m_val
+---
class CDiamondClass1 size(24):
+---
| +--- (base class CSubClassV1)
0 | | {vbptr}
| +---
| +--- (base class CSubClassV2)
8 | | {vbptr}
| +---
+---
+--- (virtual base CBaseClass)
16 | m_val
+---
class CDiamondClass2 size(32):
+---
| +--- (base class CSubClassV1)
0 | | {vbptr}
| +---
| +--- (base class CSubClassV2)
8 | | {vbptr}
| +---
| +--- (base class CSubClassV3)
16 | | {vbptr}
| +---
+---
+--- (virtual base CBaseClass)
24 | m_val
+---
class CDiamondSubClass1 size(24):
+---
| +--- (base class CDiamondClass1)
| | +--- (base class CSubClassV1)
0 | | | {vbptr}
| | +---
| | +--- (base class CSubClassV2)
8 | | | {vbptr}
| | +---
| +---
+---
+--- (virtual base CBaseClass)
16 | m_val
+---
class CDiamondSubClass2 size(48):
+---
| +--- (base class CDiamondClass1)
| | +--- (base class CSubClassV1)
0 | | | {vbptr}
| | +---
| | +--- (base class CSubClassV2)
8 | | | {vbptr}
| | +---
| +---
| +--- (base class CDiamondClass2)
| | +--- (base class CSubClassV1)
16 | | | {vbptr}
| | +---
| | +--- (base class CSubClassV2)
24 | | | {vbptr}
| | +---
| | +--- (base class CSubClassV3)
32 | | | {vbptr}
| | +---
| +---
+---
+--- (virtual base CBaseClass)
40 | m_val
+---
我的编译器是8字节对齐的,你的可能是4字节对齐,所以有差异,这里仅供参考。