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

标签 c++ visual-studio dll virtual

首先,我对 dll 编程还很陌生。所以我正在编写一个 UI dll,它应该对我的项目有帮助。问题是我遇到了错误,这些错误并没有真正说明什么,而且我有点困惑。 所以我有一个名为 UIContainer 的类,女巫应该是我的基类,所有其他(按钮等)都从中派生。因为我将它们保存在 UIContainer 类型的指针列表中,所以我必须使用虚拟方法。但是当把虚拟语句放在我的方法之前时,它给了我错误所以我研究了一个发现,我必须将它们声明为纯虚拟方法所以我创建了 UIElement 类,它只是 UIContainer 能够使用的接口(interface)虚方法,并且不必在从 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

(请注意,我试图将错误翻译成英语,因为我来自德国,因此会出现德语错误;))

最佳答案

所以我找到了问题所在。 如果您在 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();
...
}

关于c++ - DLL编程(C++ | MSVS) 虚拟和派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832115/

相关文章:

c# - 将 float* 编码到 C#

c++ - 在 EXE 内部分发 DLL (C++)

c++ - 如何递增表示为字符串的 IP 地址?

c++ - 在 C++ 中,有两个结构引用彼此的变量

sql - 如何在visual studio中调试sql

visual-studio - AnkhSvn 撤销/恢复提交

java - 将 DLL 添加到 NetBeans 项目

c++ - C++ 中的 goto 和 RAII

c++ - 虚拟继承中的构造函数顺序

c# - 使用 msbuild 执行文件系统发布配置文件