以下是com本质论中一个例子:void BadCOMCode(/*[in]*/ IUnknow *pUnk){
ICat *pCat = 0; IPug *pPug = 0;
HRESULT hr;
hr= pUnk->QueryInterface(IID_ICat,(void**)&pCat);
if(FAILED(hr))goto cleanup;
hr = pUnk->QueryInterface(IID_IPug,(void**)&pPug);
if(FAILED(hr))goto cleanup;
pPug->Bark();pCat->IgnoreMaster();
cleanup:
if(pCat)pCat->Release();
if(pPug)pPug->Release();
}书上讲,pCat、pPug和pUnk都指向同一个对象我有一个疑问,既然指向同一个对象,这三个接口指针的值却都不同,何解?
指向一个对象的地址,不是对象的首地址么,什么会在三个接口指针的值都不同的情况下,还能指向同一个对象?

解决方案 »

  1.   

    这是C++语言多重继承的问题。
    如果一个类只继承了一个类,则他的实例的前四个字节是虚函数表的地址。但如果一个类继承了多个类,那么它应该有多个虚函数表,好像所有的编译器都是按顺序排列的,即他的实例的最开始四个字节是他继承的第一个类的虚函数表指针,再四个字节是第二个的,以此类推。所以,在转型操作时,编译器会根据你要转成什么而相应对this做出调整(偏移4字节的整数倍以指向该类的虚函数表)。
      

  2.   

    创建组件对象,如果成功的话,就得到了指向IUnknown的接口指针,因为所有的接口都继承于IUnknown,所以所有的接口都有QueryInterface成员函数,可以通过它获得该对象所支持的任何一个接口指针。接口是包含了一组函数的数据结构。
    pCat、pPug应该是接口指针。
    就这些了,希望对你有帮助。
      

  3.   

    这是同一个对象的不同的接口,在COM中一定有一个接口为IUnknown这个接口中有方法QueryInterface这个方法的作用是通过IID去获这个对象的其它的接口,它返回的是指向同一对象的不同接口,IID_ICat,IID_IPug也是这个对象的两个接口
      

  4.   

    To:楼上的各位如果知道了“N个”接口指针,如何判断它们都指向同一对象?
      

  5.   

    对这N个接口查询IUnknown接口,如果返回值相等则意味着指向同一个接口。