65,211
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
class IUnknow
{
public:
virtual void QueryInterface()=0;
virtual void* Convert()=0;
};
class ISomeInterface:public IUnknow
{
public:
virtual void SomeFunction()=0;
};
class INondelegatingUnknow
{
public:
virtual void NondelegatingQueryInterface()=0;
virtual void* NondelegatingConvert()=0;
};
class CObj:public ISomeInterface,public INondelegatingUnknow
{
public:
void QueryInterface()
{
cout << "this*PtrAddress:" << this << endl;
cout << "QueryInterface()" << endl;
}
void* Convert()
{
cout << "this*PtrAddress:" << this << endl;
return (INondelegatingUnknow*)this;
}
void SomeFunction()
{
cout << "this*PtrAddress:" << this << endl;
cout << "SomeFunction()" << endl;
}
void NondelegatingQueryInterface()
{
cout << "this*PtrAddress:" << this << endl;
cout << "NondelegatingQueryInterface()" << endl;
}
void* NondelegatingConvert()
{
cout << "this*PtrAddress:" << this << endl;
return (IUnknow*)this;
}
};
void Display(CObj* po)
{
}
int main()
{
CObj* pobj = new CObj;
////////////////////////////
INondelegatingUnknow* pnondelegatingUnknow = (INondelegatingUnknow*)pobj;
IUnknow* punknow = (IUnknow*)pobj;
cout << "TipInfo:INondelegatingUnknow*->NondelegatingQueryInterface()" << endl;
pnondelegatingUnknow->NondelegatingQueryInterface();
cout << "TipInfo:Ptr Address:" << pnondelegatingUnknow << endl;
///////////////////////////
cout << "TipInfo:IUnknow*->QueryInterface()" << endl;
punknow->QueryInterface();
cout << "TipInfo:Ptr Address:" << punknow << endl;
///////////////////////////
cout << "TipInfo:--------------------------------------------------" << endl;
///////////////////////////
cout << "TipInfo:(IUnknow*)INondelegatingUnknow*\tWe call QueryInterface(),but..." << endl;
punknow = (IUnknow*)pnondelegatingUnknow;//punknow Value Change
punknow->QueryInterface();
cout << "TipInfo:Ptr Address:" << punknow << endl;
///////////////////////////
cout << "TipInfo:(ISomeInterface*)(IUnknow*)INondelegatingUnknow*" << endl;
ISomeInterface* psomeinterface = (ISomeInterface*)punknow;//punknow from INondelegatingUnknow*
//psomeinterface->SomeFunction();//Exception! Cannot execute from INondelegatingUnknow* to IUnknow* to ISomeInterface*
cout << "TipInfo:Ptr Address:" << psomeinterface << endl;
///////////////////////////
cout << "TipInfo:(INondelegatingUnknow*)IUnknow*\tWe call NondelegatingQueryInterface()" << endl;
punknow = (IUnknow*)pobj;
pnondelegatingUnknow = (INondelegatingUnknow*)punknow;
pnondelegatingUnknow->NondelegatingQueryInterface();
cout << "TipInfo:Ptr Address:" << pnondelegatingUnknow<< endl;
//////////////////////////
cout << "TipInfo:(INondelegatingUnknow*)ISomeInterface*\tWe call NondelegatingQueryInterface(),but..." << endl;
psomeinterface = (ISomeInterface*)pobj;
pnondelegatingUnknow = (INondelegatingUnknow*)psomeinterface;
pnondelegatingUnknow->NondelegatingQueryInterface();
cout << "TipInfo:Ptr Address:" << pnondelegatingUnknow << endl;
/////////////////////////
cout << "TipInfo:--------------------------------------------------" << endl;
/////////////////////////
cout << "TipInfo:INondelegatingUnknow* PtrAddress" << endl;
pnondelegatingUnknow = (INondelegatingUnknow*)pobj;
cout << pnondelegatingUnknow << endl;
cout << "TipInfo:ISomeInterface* PtrAddress" << endl;
psomeinterface = (ISomeInterface*)pobj;
cout << psomeinterface << endl;
cout << "TipInfo:IUnknow* PtrAddress" << endl;
punknow = (IUnknow*)pobj;
cout << punknow << endl;
/////////////////////////
cout << "TipInfo:__________________Convert Function_______________" << endl;
cout << "TipInfo:INondelegatingUnknow*->NondelegatingConvert() to IUnknow*,We call QueryInterface()" << endl;
punknow = (IUnknow*)pnondelegatingUnknow->NondelegatingConvert();
punknow->QueryInterface();
cout << "TipInfo:Ptr Address:" << punknow << endl;
/////////////////////////
cout << "TipInfo:(ISomeInterface*)(IUnknow*)INondelegatingUnknow*->NondelegatingConvert(),We call SomeFunction" << endl;
psomeinterface = (ISomeInterface*)punknow;
psomeinterface->SomeFunction();
cout << "TipInfo:Ptr Address:" << psomeinterface << endl;
/////////////////////////
cout << "TipInfo:IUnknow*->Convert() to INondelegatingUnknow*,We call NondelegatingQueryInterface()" << endl;
punknow = (IUnknow*)pobj;
pnondelegatingUnknow = (INondelegatingUnknow*)punknow->Convert();
pnondelegatingUnknow->NondelegatingQueryInterface();
cout << "TipInfo:Ptr Address:" << pnondelegatingUnknow << endl;
return 0;
}

