多重继承和类型转换的问题

今天学习com的时候遇到“多重继承和类型转换的问题”,记录下来以备参考:

在多重继承中,使用static_cast<目标类型名>把子类对象指针向父类类型转换时,会移动指针指向正确的父类对象部分。在reinterpret_cast<目标类型名>不会移动指针。所以在是哟很难干QueryInterfface(const IID $ iid,void ** pv){...}实现中必须使用<static_cast>转换。

以下内容来自《com 技术内幕》

通常将一种类型的指针转换成另外一种类型并不会改变它的值。但为了支持多重继承,在某些情况下,C++必须改变类型指针的值。许多C++程序员并不清楚多重继承的此种负面效果。现在我大概了解到,为什么JAVA舍弃多重继承而只采用单一父类继承了。

例如假定有一个类CA定义如下:    class CA:public IX,publicIY {...}    由于CA通史继承了IX和IY,因此在可以使用IX或IY指针的地方均可以使用指向CA的指针。例如可以将指向CA的指针传給接受IX或IY指针的函数,这样此函数仍将能够正常工作。

例如:   

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的虚拟函数表中的内容是不一样的。因此在将一个IX vtbl传給bar时,次函数将不能正常工作。因此编译器将同一指针传给foo和bar是不可能的,他必须对CA的指针进行修改以便它指向一个合适的vabl指针,下图显示了类CA对象的内存结构:

多重继承和类型转换的问题_第1张图片

从图可以看到,CA的this指针指向IX的虚拟函数表。因此可以在不改变CA的this指针的值的情况下用它来代替IX指针。但是从图中可以很明显地看出,类CA的this指针并没有指向IY的虚拟函数表指针。因此在将指向类CA的指针传给一个接受IY指针的函数之前,其值必须修改。为完成此种修改,编译器将把IY虚拟函数表指针的偏移量(xIY)加到CA的this指针上,因此编译器将把下面的代码:    IY * pC =pA;    转换成与下面类似的代码:    IY * pC=(char*)pA + xIY;

你可能感兴趣的:(java,c,工作,delete,Class,编译器)