DLL编程(C ++ | MSVS)虚拟和派生

时间:2014-11-09 19:07:44

标签: c++ visual-studio dll virtual

首先,我对dll编程很新。所以我正在编写一个UI dll,它可以帮助我完成我的项目。问题是我遇到了错误,并没有真正说出来,我有点困惑。 所以我有一个名为UIContainer的女巫应该是我的基类,所有其他人(按钮等)都来自这个类。因为我将它们保存在UIContainer类型的指针列表中,我将使用虚拟方法。但是当把虚拟语句放在我的方法之前它给了我错误,所以我研究了一个被发现的,我要将它们声明为纯虚拟方法,所以我创建了UIElement类,它只是UIContainer能够使用的接口虚拟方法,并且不必在每个派生自UIContainer的类中重新实现它们。但现在我得到这些错误并无法解释原因。有人有想法吗?

Error 42    error LNK2001: Unresloved external symbol ""__declspec(dllimport) const Button::`vftable'" (__imp_??_7Button@@6B@)".

Error 43    error LNK2001: Unresloved external symbol ""__declspec(dllimport) const UIContainer::`vftable'" (__imp_??_7UIContainer@@6B@)".

Error 44    error LNK2001: Unresloved external symboll ""__declspec(dllimport) const UIElement::`vftable'" (__imp_??_7UIElement@@6B@)".

Error 45    error LNK1120: 3 unresloved externals

(请注意,我试图用英语翻译错误,因为我来自德国并因此得到德语错误;))

1 个答案:

答案 0 :(得分:0)

所以我发现了问题。 如果您在dll中使用虚拟方法,则必须为im / export声明所有方法分开。

举个例子:

#ifdef UICONATINER_EXPORTS
#define UICONATINER_API __declspec(dllexport) 
#else
#define UICONATINER_API __declspec(dllimport) 
#endif

通常你会把这个类定义为ex / import,如下所示:

class UICONATINER_API UIContainer
...

但是如果虚拟方法不起作用,你就这样做了 对于每种方法:

class UIContainer
{
...
    UICONATINER_API void unfocused();
    UICONATINER_API void draw();
...
}