簡體   English   中英

在基接口類中缺少虛擬析構函數?

[英]Missing virtual destructor in base interface 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
  };
}

當我編譯派生類時,我得到以下警告(在OpenCV項目中將其視為錯誤):

基類'struct IUnknown'具有可訪問的非虛析構函數[-Werror = non-virtual-dtor]

我很難理解這是否是MinGW(缺少虛擬析構函數)的錯誤或其他可能以IUnknown派生的方式被規避的錯誤。 OpenCV項目是在其他幾個沒有彈出警告的環境中構建的......

在COM的上下文中,通過引用計數使用 IUnknownAddRef()Release()方法進行對象的生命周期管理(以及相關的清理)。

每個COM對象都有一個與之關聯的引用計數。 當對象的引用計數達到0(例如,在某個COM接口指針上對象的多個客戶端正確調用了Release() ),該對象將被銷毀。 換句話說,COM對象不會以通常的C ++方式銷毀,例如在基類指針上調用delete (因此在基類中需要適當的virtual析構函數)。
(事實上​​,你不能只調用new來分配一個COM對象。需要更多的COM機制。)

換句話說,當你完成一個COM接口指針時,你只需要調用它上面的Release() 因此,不需要在“基類”中定義虛擬析構函數,例如IUknown接口或其他COM接口。

因此,我懷疑警告是MinGW工具鏈中的某個錯誤。

應該在您引用的Windows SDK頭文件中修改IUnknown的定義, 也不應該在您可能為您的目的定義的自定義COM接口中添加虛擬析構函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM