2013-05-18 57 views
0

我有一個帶有純虛函數的導出類Base的MyApi.dll。另外,我有 派生類在相同的dll中實現了虛函數。 工廠函數返回派生類對象。無法調用導出的虛函數

#define MYAPI_EXPORT __declspec(dllexport) 
class MYAPI_EXPORT base{ virtual int func() = 0;} 
class MYAPI_EXPORT derived: public base 
{ 
    int func(){ 
     return 4; 
    } 
} 
MYAPI_EXPORT void *factoryfunction() 
{ 
void *obj = new derived; 
return obj; 
} 

而下面是調用這個派生函數的代碼。

CString dllName = _T("MyApi.dll"); 
typedef void* (*fn)(); 


HINSTANCE hModule = ::AfxLoadLibrary(dllName); 
if(hModule) 
{ 
    fn pfn = (fn)GetProcAddress(hModule,"factoryFunction"); 
    Base* pcDerived = (Base*)pfn; 

    pcDerived->func(); 
} 

我使用LoadLibrary加載了MyApi.dll。 然後我調用一個工廠函數,返回派生類指針,然後調用實現的函數。工廠函數返回指向派生類對象的指針,但在運行時調用虛函數失敗。 這沒有幫助 - > Not necessary to export class with only virtual/inline functions?

+0

爲什麼不同時導出類? –

+0

它如何失敗?它會崩潰,返回錯誤的值,等等...... –

+0

@brianbeuning我也試過了。這是行不通的。 –

回答

0

在派生類中聲明您的方法爲虛擬並覆蓋。所以它應該看起來像以下:

class MYAPI_EXPORT derived: public base 
{ 
    virtual int func() override { 
     return 4; 
    } 
} 

只是說這是ovveride(或什麼都沒有,在你的情況下),將打破一切

+0

什麼?當基類定義了一個具有相同簽名的方法時,「virtual」是隱含的。而'override'實際上並不做任何事情,它只是一個微軟的編譯器擴展,它確保你實際上在基類中覆蓋了一個函數。它不會更改代碼。 –