那他的3个方法如何重写, 给个案例
时间: 2024-03-23 09:39:24 浏览: 18
好的,下面是一个简单的重写 IUnknown 接口中三个方法的示例:
```c++
class MyComponent : public IUnknown
{
private:
ULONG m_refCount;
public:
MyComponent()
{
m_refCount = 1; // 初始化引用计数为 1
}
// IUnknown methods
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
if (ppvObject == NULL)
return E_POINTER;
*ppvObject = NULL;
if (riid == IID_IUnknown)
{
*ppvObject = static_cast<IUnknown*>(this);
}
else if (riid == IID_IMyInterface)
{
*ppvObject = static_cast<IMyInterface*>(this);
}
else
{
return E_NOINTERFACE;
}
// 成功查询到接口,需要增加引用计数
AddRef();
return S_OK;
}
ULONG STDMETHODCALLTYPE AddRef()
{
return InterlockedIncrement(&m_refCount); // 原子性地增加引用计数
}
ULONG STDMETHODCALLTYPE Release()
{
ULONG newRefCount = InterlockedDecrement(&m_refCount); // 原子性地减少引用计数
if (newRefCount == 0)
{
delete this; // 引用计数为 0,销毁自己
}
return newRefCount;
}
// ... other methods
};
```
这个示例中,我们使用了一个私有变量 `m_refCount` 来存储当前对象的引用计数。在实现 QueryInterface 方法时,我们先检查要查询的接口是否是 IUnknown 或者我们实现的接口,然后增加引用计数。在实现 AddRef 方法时,我们使用了 InterlockedIncrement 函数来实现原子性地增加引用计数。在实现 Release 方法时,我们使用了 InterlockedDecrement 函数来实现原子性地减少引用计数,如果引用计数为 0,我们就销毁自己。