2009-02-14 57 views
5

在Win32上的C++:不需要導出只有虛擬/內聯函數的類?

假設我有一個聲明類的頭文件的DLL。 DLL導出一些獲取指向該類的實例的指針/引用的方法,例如工廠函數。

我正確地認爲,如果只打算對其實例調用虛函數或內聯函數,那麼不需要將該類標記爲使用__declspec導出?

相反,如果想調用非虛擬成員函數,是否需要導出類聲明?

回答

6

我正確地相信,如果只打算對其實例調用虛函數或內聯函數,那麼不需要將該類標記爲使用__declspec導出?

是的,這是正確的,這就是COM所做的事,DLL只發布4個方法,其中一個返回到類工廠,其所有成員都是純虛函數。

相反,如果希望調用靜態定義的成員函數,是否需要導出類聲明?

不,只導出靜態成員函數。

1

只有在函數/類具有頭文件中定義的所有函數時,才需要它。 它不依賴虛擬性。

因此,如果您不導出所有類,只要在cpp文件中沒有任何公共或受保護的函數定義,它就可以被客戶端代碼使用。

通過在函數聲明中使用__declspec而不是在類名聲明中,您還可以僅聲明要導出的特定成員函數而不是整個類。

+0

「它不依賴於虛擬性」它不是?如果一個函數是虛擬的,那麼它通過vptr/vtable調用。例如,COM對象不會導出每個(甚至任何)方法實現。 – ChrisW 2009-02-14 23:45:49

1

上午我相信正確的...

是的,我是這麼認爲的,但是:

  • 您應該測試(我不能在此刻)

  • 你可能想要小心使用內聯方法:因爲如果你稍後改變它們,那麼你應該重建每一個依賴這個類的(已經構建的)其他組件(即DLL不再是絕對的或獨立的......內聯方法在單個DLL內是可以的,但是如果在DLL的導出接口中使用,則有利於一種'DLL地獄')。

相反,是有必要的出口類的聲明,如果人們想調用靜態定義的成員函數?

如果不是整個類,則需要導出至少那些單獨的靜態方法。

1

C++名稱mangling是寫入交叉編譯器模塊的成功的一個負擔, 只需聲明您想要公開的類爲僅包含虛擬函數的接口。 具有虛擬功能的類的佈局可能是「標準化的」,請考慮COM。