c++ - IUknown 派生接口(interface)上的虚拟析构函数

标签 c++ c++11 com

我一直在通过阅读一些现有代码来学习一些代码。我知道在非 com 类型的接口(interface)上使用虚拟析构函数的重要性。我的意思是它不是从 IUnkown 或 IInspectable 派生的。

但是,我无法理解为什么不需要在 COM 接口(interface)上使用虚拟析构函数。

我的接口(interface)是这样定义的

MIDL_INTERFACE("0D70D782-809D-403B-AC95-XXXXXX")
IMyInterface : IUnknown
{
    public:
      virtual bool method1() = 0;
      virtual int method2() = 0;
}

同时我还有另一个接口(interface),它不是像这样从 IUnkown 派生的

    class ISampleLogic
    {
      public:
         virtual ~ISampleLogic() {};
         //some more methods

    }

为什么第一个接口(interface)没有虚析构函数?

提前致谢

最佳答案

IUnknown 有一个名为 Release() 的方法。它的工作是减少对象的引用计数,并在引用计数降为零时销毁该对象。所以它充当析构函数;因此不需要显式析构函数。

如果你有一个IUnknown指针(比如IUnknown* punk),你不应该删除它,而是调用Release () 而不是 (punk->Release())。这是因为其他进程可能对该对象有引用计数。

这取决于接口(interface)的实现,以确保删除整个对象。如有必要,该实现很可能包含具有虚拟析构函数的类。

关于c++ - IUknown 派生接口(interface)上的虚拟析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27289202/

相关文章:

c++ - 为什么不能推导嵌套在模板类中的枚举的模板参数?

c++ - 左值初始化失败

c++ - 为什么编译器会提示对 constexpr 函数的 undefined reference ,即使它是在另一个源文件中定义的?

com - 如何读取 winmd(WinRT 元数据文件)?

com - Powershell COM 对象

c++ - 使用模式初始化 `constexpr` 数组

c++ - 信号/槽连接总数?

c++ - ACE 如何启用 IPv6

c# - 未从 C# 中找到 C++ COM DLL 中的导出函数

c++ - 众所周知的虚拟文件夹 GUID 是什么?