下面的代码来自:http://www.codeproject.com/atl/atl_underthehood_.asp
代码中的(Drive*)SOME_VALUE不就是(Drive*)1,将1转换为Drive*???搞不明白,请指点,谢谢!!!#include <iostream>
using namespace std;class Base1 {
public:
virtual void f() { }
};class Base2 {
public:
virtual void f() { }
};class Base3 {
public:
virtual void f() { }
};class Drive : public Base1, public Base2, public Base3 {
};// any non zero value because multiply zero with any no is zero
#define SOME_VALUE 1int main() {
cout << (DWORD)static_cast<Base1*>((Drive*)SOME_VALUE)-SOME_VALUE << endl;
cout << (DWORD)static_cast<Base2*>((Drive*)SOME_VALUE)-SOME_VALUE << endl;
cout << (DWORD)static_cast<Base3*>((Drive*)SOME_VALUE)-SOME_VALUE << endl;
return 0;
}

解决方案 »

  1.   

    首先,Base1,Base2,Base3内部都是只有一个vptr,占4bytes
    Drive拥有这三个基类的vptr,所以是12bytes.布局如下:
    vptr1
    vptr2
    vptr3将1转换为Drive*的语意是从内存地址的0x00000001为起始地址,共12bytes的空间解析为一个
    Drive object.暂时先把这个指针看做是Drive* pDrive;其余为Base1* pB1;Base2* pB2;
    Base3* pB3;
    static_cast<Base1*>(pDrive);所得的指针是指向Drive object中的基类Base1的subobject的地址,由上面的布局得知,从0x00000001到0x00000004是该subobject,所以pB1是指向0x00000001.
    相应地pB2顺沿4bytes,基类Base2的subobject是从0x00000005到0x00000008,pB2是指向0x00000005,同理pB3是指向0x00000009,其subobject是从0x00000009到0x0000000C.所求的差值意思就是这些基类的subobject相对于子类object的偏移量.不管SOME_VALUE取多少,这些偏移量是不会变的.
      

  2.   

    vptr只不过时一个指向虚拟函数表的指针,关键是掌握继承关系