class CBaseX
{
public:
int x;
CBaseX() { x = 10; }
void foo() { printf("CBaseX::foo() x=%d\n", x); }
};
class CBaseY
{
public:
int y;
int* py;
CBaseY() { y = 20; py = &y; }
void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py);
}
};
class CDerived : public CBaseX, public CBaseY
{
public:
int z;
};
CDerived的內(nèi)存布局(Memory Layout)
如 圖所示,CDerived的內(nèi)存布局包括兩個(gè)對(duì)象,CBaseX 和 CBaseY,編譯器也知道這一點(diǎn)。因此,當(dāng)你將CDerived* 轉(zhuǎn)換到 CBaseY*時(shí),它給指針添加4個(gè)字節(jié),同時(shí)當(dāng)你將CBaseY*轉(zhuǎn)換到CDerived*時(shí),它給指針減去4。然而,甚至它即便不是一個(gè) CDerived你也可以這樣做。
轉(zhuǎn)自:http://hi.baidu.com/elseif/blog/item/3abd0216b61fd14b20a4e9e2.html