一般将一种类型的指针转换成另外一种类型并不会改变它的值。但是为了支持多重继承,在某些情况下,c++必须改变类指针的值。
例如 :
class CA : public IX,
public IY
{
};
由于CA同时继承了IX和IY ,因此在可以使用IX或 IY指针的地方均可以使用指向CA的指针。
void foo(IX*
pIX);
void bar(IY*
pIY);
int main()
{
CA*
pA = new CA;
foo(pA);
bar(pA);
delete
pA;
return
0;
}
Foo需要一个指向合法的IX的虚拟函数表的指针。
Bar则需要一个指向IY虚拟函数表的指针。
而IX和IY的虚拟函数表中的内容是不一样的。编译器将同一指针传给foo和bar是不可能的。必须对CA的指针进行修改以便它指向一个合适的vabl指针。
从图可以看出,
CA的this指针指向IX的虚拟函数表。所以可以不改变CA的this指针用它来代替IX指针。
CA的this指针没有指向IY的虚拟函数表指针。所以在将指向类CA的指针传给一个接收IY指针的函数之前,其值必须修改。编译器将把IY虚拟函数表指针 的偏移量(△IY)加到CA的 this指针上。
IY* pC = pA;
与下面类似的代码:
IY* pC = (char*)pA + △IY;