关于COM对象的QueryInterface在C++兑现中通过强制转换对象的this指针的对应的接口指针的疑惑

关于COM对象的QueryInterface在C++实现中通过强制转换对象的this指针的对应的接口指针的疑惑?
到现在没搞明白,例如:假如一个COM对象MyCom通过纯虚函数方式继承接口IA与接口IB,资料上讲通过CLSID与IA接口IID使用CoCreateInstance函数可获得IA的接口指针,而MyCom对象的内存形式是MyCom的This指针指向的是:IA的Vtable指针,依次
为IB的Vtable指针,MyCom对象的属性数据.而C++实现的QueryInterface中通过(IA *)This得到接口IA的指针,而(IB *)This即得到接口IB的指针,明明This指针指向的是IA的Vtable指针,怎么一强制转换后能变成指向接口IB的指针(即IB的Vtable指针,它是位于This+4(byte)的位置上啊),是C++有这样的规则吗,强制转换能实现上述内存指针变换,有哪本书上有介绍吗??
期盼解答中...


------解决思路----------------------

据我所知,一个COM类中如果包含多个Interface,

可以通过QueryInterface来查询里面的n个接口的指针

事实上只是前面的那个接口标识符来区别的 比如IID_IInterfaceA ,IID_IInterfaceB分别对应A接口,和B接口。
------解决思路----------------------
C++有这样的规则,我也是看了<COM技术内幕>才知道的。
试一试就知道了:(下面代码显示pB的地址是pA+4)
C/C++ code
struct IA{
    virtual void Afunc() = 0;
};
struct IB{
    virtual void Bfunc() = 0;
};
struct IMyComm:IA,IB{
};
//实现
struct CMyComm:IMyComm{
    virtual void Afunc(){;}
    virtual void Bfunc(){;}
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    IMyComm *pMyComm = new CMyComm;
    IA *pA = pMyComm;
    IB *pB = pMyComm;

    ShowMessage(AnsiString().sprintf("pMyComm Addr:\t%X\npA Addr:\t%X\npB Addr:\t%X",pMyComm,pA,pB));
}