模仿com接口
#include <iostream>
using namespace std;
// 定义接口关键字
#define interface struct
// 查询接口
#define QUERYINTERFACE(Interface, iid) \
if(iid == IID_##Interface) \
return static_cast<Interface *>(this);
// 查询不存在的接口
#define QUERYINTERFACE_IUNKNOWN(BaseInterface, iid)\
if(iid == IID_IUnknown) \
return static_cast<IUnknown *>(static_cast<BaseInterface*>(this)); // 向上转型到IUnknown
// 每个接口的uuid,为了方便,这里直接手写
#define IID_IUnknown 0
interface IUnknown {
virtual void* queryInterface(int iid) = NULL;
};
#define IID_IItem 1
interface IItem : public IUnknown {
virtual void showMsg() = NULL;
};
#define IID_IViewItem 2
interface IViewItem : public IItem {
virtual void printMsg() = NULL;
};
#define IID_IData 3
interface IData : public IItem {
virtual int add(int a, int b) = NULL;
};
class PlazaView : public IViewItem, public IData {
public:
void showMsg() {
cout << "showMsg" << endl;
}
void printMsg() {
cout << "printMsg" << endl;
}
int add(int a, int b) {
return a + b;
}
void* queryInterface(int iid) {
QUERYINTERFACE(IViewItem, iid);
QUERYINTERFACE(IData, iid);
QUERYINTERFACE_IUNKNOWN(IViewItem, iid);
return NULL;
}
};
int main()
{
PlazaView p;
IUnknown* iUnknown = (IUnknown*)p.queryInterface(IID_IUnknown);
IData* iData = (IData*)iUnknown->queryInterface(IID_IData);
cout << iData->add(1, 2) << endl;
system("pause");
return 0;
}
关键点
IUnknown* iUnknown = (IUnknown*)p.queryInterface(IID_IUnknown);
IData* iData = (IData*)iUnknown->queryInterface(IID_IData);
暂时不知道怎么描述,先占个坑。