以下是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都指向同一个对象我有一个疑问,既然指向同一个对象,这三个接口指针的值却都不同,何解?
指向一个对象的地址,不是对象的首地址么,什么会在三个接口指针的值都不同的情况下,还能指向同一个对象?
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都指向同一个对象我有一个疑问,既然指向同一个对象,这三个接口指针的值却都不同,何解?
指向一个对象的地址,不是对象的首地址么,什么会在三个接口指针的值都不同的情况下,还能指向同一个对象?
如果一个类只继承了一个类,则他的实例的前四个字节是虚函数表的地址。但如果一个类继承了多个类,那么它应该有多个虚函数表,好像所有的编译器都是按顺序排列的,即他的实例的最开始四个字节是他继承的第一个类的虚函数表指针,再四个字节是第二个的,以此类推。所以,在转型操作时,编译器会根据你要转成什么而相应对this做出调整(偏移4字节的整数倍以指向该类的虚函数表)。
pCat、pPug应该是接口指针。
就这些了,希望对你有帮助。