2010-02-04 33 views
5

我有兩個DLL a.dll和b.dll,並在每一個我有一個類AClass和BClass。
我想同時具有AClass和BClass繼承和實現相同的接口AbsBase這是一個純粹的抽象類。
在每個類中,我爲__declspec(dllimport)和__declspect(dllexport)設置了#defines。當我試圖編譯我得到這個:純基類需要從DLL中導出?

警告C4275:非的dll接口類「ACLASS」作爲基礎的dll接口類「AbsBase」

基本上要我申報AbsBase爲__declspec (dllexport)
但是,如果編譯器有他的方式,我將不得不聲明AbsBase從a.dll和b.dll中導出。

爲什麼一個類的接口需要導出?
有沒有辦法解決它? 應該從兩個DLL中真正導出AbsBase嗎?這不是有什麼內在的錯誤嗎? (我需要定義新XXX_EXPORT宏..)

+0

你能製作第三個DLL嗎? – jmucchiello

+0

向我們展示您的界面和類聲明。 –

回答

3

它看起來像一個編譯器警告,而不是一個錯誤,所以它應該仍然工作。編譯器只是讓你知道你正在做的事情會讓你很容易搞砸。只要DLL和核心程序都同意基類的定義,就應該完全可以接受。

您應該能夠使用編譯來剿警告:

http://forums.devx.com/archive/index.php/t-84785.html

+1

從「拉爾夫」在該線程的響應被照明。 @OP:你會不會遇到提到提供拉爾夫這個問題,你的基類仍然是純粹的抽象*永遠*。 –

+0

製作解決了這個問題的基類完全純虛。 – shoosh

0

我有一個提示:

class Base { 
    public: 
    virtual void f() = 0; 
    virtual void g() = 0; 
    virtual ~Base(); 
}; 

class A: public Base { 
    public: 
    virtual void f(); 
    virtual void g(); 
}; 

class B: public Base { 
    public: 
    virtual void g(); // REVERSE ORDER 
    virtual void f(); 
}; 

的f和g中的虛擬方法表中的順序在基類指定,並且該信息是非常需要。

+0

是的。這就是它在頭文件中的原因。 –

1

這事發愁。編譯器檢測到基類中的代碼可能運行。它不是純粹的虛擬方法,它知道如何過濾這些方法。也許是一個構造函數或析構函數?失敗模式是類對象的內存佈局在客戶端代碼和DLL中可能不一樣。這造成的運行時間混亂是非常難以診斷

你會沒事的,如果只要你能保證在客戶端和DLL編譯使用完全相同的編譯和鏈接設置,使用CRT和這些工具完全相同的版本。通過使用非標準的__interface關鍵字而不是類,可以使基類保證抽象。