COM对象必须具备的两大特性:多接口(QueryInterface),引用计数(AddRef and Release)。
由于COM对象都必须实现这三个函数,所以COM定义了一个标准接口IUnknown:
class IUnknown
{
public:
virtual HRESULT QueryIterface(RIID riid,void**ppObj)=0;
virtual ULONG AddRef()=0;
virtual ULONG Release()=0;
};
对象可以通过从IUnknown派生实现这三个函数,即:由一个抽象基类派生另一个抽象基类。
例如:
class IDB:public IUnknown
{
public:
virtual HRESULT Read (short nTable,short nRow,LPWSTR lpszData)=0;
(...)
};
这种方法很简单的将两个vtable合二为一;IDB包含所有IUnknown的函数;IDB的vtable的前三个函数就是IUnknown中的前三个函数。
另一种实现方法是将函数添加到自己的接口处:
class IDB{
public:
virtual HRESULT QueryInterface(RIID riid,void ** Obj)=0;
virtual ULONG AddRef()=0;
virtual ULONG Release()=0;
virtual HRESULT Read (short nTable,short nRow,LPWSTR lpszData)=0;
(...)
};