一,QueryInterface函數(shù)原型:
HRESULT __stdcall QueryInterface(const IID&iid,void **ppv);
iid:標(biāo)志客戶所需的接口。是”一個(gè)接口標(biāo)志符“結(jié)構(gòu)(IID)。ppv:QueryInterface用來存放所請(qǐng)求接口的地址。
返回值:可以返回S_OK 或 E_NOINTERFACE應(yīng)該用SUCEEDED或者FAILED宏驗(yàn)證是否成功。
使用方法:
假如知道一個(gè)指向IUnknown接口的指針pI,傳給它一個(gè)接口標(biāo)志符即可
例如:
多重繼承及類型轉(zhuǎn)換。
通常將一種類型的指針轉(zhuǎn)換為另一種類型并不會(huì)改變它的值。為了支持多重繼承,某些情況下,C++必須改變類指針的值。假如一個(gè)類定義如下:
class CA: public IX,public IY{...};
由于CA同時(shí)繼承了IX,IY因此可以使用IX或IY指針的地方均可以使用指向CA的指針。
foo需要一個(gè)指向合法的IX的虛擬函數(shù)表的指針;bar需要一個(gè)指向合法的IY的虛擬函數(shù)表的指針;當(dāng)然IX和IY的虛擬函數(shù)表的內(nèi)容是不一樣的。因此將一個(gè)IX vtbl傳給bar時(shí),此函數(shù)是不能正常工作的。因此編譯器將同一指針傳給foo和bar是不可能的,它必須對(duì)CA的指針進(jìn)行修改以便他指向一個(gè)合適的vtbl指針。下圖顯示了CA對(duì)象的內(nèi)存結(jié)構(gòu)。
Copyright 艾凡赫.