IUknown派生接口上的虚拟析构函数

时间:2014-12-04 08:19:14

标签: c++ c++11 com

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

但是,我无法理解为什么不需要在COM接口上安装虚拟析构函数。

我的界面定义如下

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

同时我还有另一个不像IUnkown那样派生的界面

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

    }

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

提前致谢

2 个答案:

答案 0 :(得分:4)

您的第一个代码段定义了一个接口,另一个定义了一个不是接口的类(即使您将其称为"另一个接口")。

MSDN

  

Visual C ++接口可以定义如下:

     
      
  • 可以从零个或多个基接口继承。
  •   
  • 无法从基类继承。
  •   
  • 只能包含公共的纯虚方法。
  •   
  • 不能包含构造函数,析构函数或运算符。
  •   
  • 不能包含静态方法。
  •   
  • 不能包含数据成员;属性是允许的。
  •   

长话短说,界面不需要,也不允许有虚拟析构函数。托管实现负责构造和销毁,COM接口定义是一组方法及其语法的契约。

答案 1 :(得分:3)

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

如果您有一个IUnknown指针(说IUnknown* punk),则不应delete,而应拨打Release()punk->Release())。那是因为其他进程可能对对象有引用计数。

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