2013-05-18 32 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'实际上并不做任何事情,它只是一个微软的编译器扩展,它确保你实际上在基类中覆盖了一个函数。它不会更改代码。 –