基接口 class 中缺少虚拟析构函数?
Missing virtual destructor in base interface class?
我有一个 class 从 IUnknown 派生 (public
),其定义(来自 MinGW 4.9.2 中的文件 include/unknwnbase.h
)我粘贴在下面:
extern "C++" {
MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
IUnknown {
public:
BEGIN_INTERFACE
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
template<class Q>
HRESULT STDMETHODCALLTYPE QueryInterface(Q **pp) {
return QueryInterface(__uuidof(Q), (void **)pp);
}
END_INTERFACE
};
}
当我编译派生的 class 时,我收到以下警告(在 OpenCV 项目中被视为错误):
base class 'struct IUnknown' has accessible non-virtual destructor [-Werror=non-virtual-dtor]
我很难理解这是 MinGW 的错误(缺少虚拟析构函数)还是可以通过派生 IUnknown 的方式规避的其他问题。 OpenCV项目搭建在其他几个环境下都不会弹出这个警告...
在 COM 上下文中,对象的生命周期管理(和关联的清理)使用 IUnknown
的 AddRef()
和 Release()
方法,通过 引用计数进行。
每个 COM 对象都有一个与之关联的引用计数。当对象的引用计数达到 0 时(例如,在对象的多个客户端已正确调用某些 COM 接口指针上的 Release()
之后),对象将被销毁。换句话说,COM 对象不会以通常的 C++ 调用方式销毁,例如delete
在基 class 指针上(因此需要在基 classes 中使用适当的 virtual
析构函数)。
(而且,事实上,您不能只调用 new
来分配 COM 对象。需要更多的 COM 机制。)
换句话说,当您使用完 COM 接口指针后,只需对其调用 Release()
。所以不需要像 IUknown
接口或其他 COM 接口那样在 "base classes" 中定义虚拟析构函数。
因此,我怀疑警告是您的 MinGW 工具链中某处的错误。
您不应该修改您引用的 Windows SDK 头文件中 IUnknown
的定义,也不 是否应该在自定义 COM 接口中添加虚拟析构函数,您可以为自己的目的定义。
我有一个 class 从 IUnknown 派生 (public
),其定义(来自 MinGW 4.9.2 中的文件 include/unknwnbase.h
)我粘贴在下面:
extern "C++" {
MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
IUnknown {
public:
BEGIN_INTERFACE
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
template<class Q>
HRESULT STDMETHODCALLTYPE QueryInterface(Q **pp) {
return QueryInterface(__uuidof(Q), (void **)pp);
}
END_INTERFACE
};
}
当我编译派生的 class 时,我收到以下警告(在 OpenCV 项目中被视为错误):
base class 'struct IUnknown' has accessible non-virtual destructor [-Werror=non-virtual-dtor]
我很难理解这是 MinGW 的错误(缺少虚拟析构函数)还是可以通过派生 IUnknown 的方式规避的其他问题。 OpenCV项目搭建在其他几个环境下都不会弹出这个警告...
在 COM 上下文中,对象的生命周期管理(和关联的清理)使用 IUnknown
的 AddRef()
和 Release()
方法,通过 引用计数进行。
每个 COM 对象都有一个与之关联的引用计数。当对象的引用计数达到 0 时(例如,在对象的多个客户端已正确调用某些 COM 接口指针上的 Release()
之后),对象将被销毁。换句话说,COM 对象不会以通常的 C++ 调用方式销毁,例如delete
在基 class 指针上(因此需要在基 classes 中使用适当的 virtual
析构函数)。
(而且,事实上,您不能只调用 new
来分配 COM 对象。需要更多的 COM 机制。)
换句话说,当您使用完 COM 接口指针后,只需对其调用 Release()
。所以不需要像 IUknown
接口或其他 COM 接口那样在 "base classes" 中定义虚拟析构函数。
因此,我怀疑警告是您的 MinGW 工具链中某处的错误。
您不应该修改您引用的 Windows SDK 头文件中 IUnknown
的定义,也不 是否应该在自定义 COM 接口中添加虚拟析构函数,您可以为自己的目的定义。