从动态库导出虚拟类有哪些限制?

时间:2013-11-23 02:27:30

标签: c++ visual-c++ gcc dll virtual

我正在使用gcc和msvc。我的目标是将动态库框架作为跨多个程序的一些基本功能的集合。使用虚拟类对我来说似乎很直观,可以在大多数程序上执行默认行为,使用的虚拟函数可以被略有不同的其他程序覆盖。

我在动态库中寻找的主要理想是可以将新的导出符号添加到库中,而无需重建所有依赖二进制文件。此外,添加内部功能应该很简单。我主要担心的是连接要求。从动态库导出虚拟类或纯虚拟的一些要求是什么,以便可以编译另一个二进制文件并与子类链接?具体做法是:

  1. 什么时候需要导出整个基类?即在类声明中使用 declspec(dllexport / dllimport)或__attribute ((visibility(“default”)))。

  2. 什么时候可以从类声明中省略export属性,只能放在所需方法的前面?

  3. 是否需要导出在基类中声明为virtual的所有方法?

  4. 编译器导出的符号如何添加到基类中? (虚拟表地址和typeinfo)

  5. 编译器添加到基类的符号是否可以显式导出而不导出整个类?

  6. 在MSVC中,当导出整个类时,单个方法或成员是否可以“未导出”?类似于在单个方法/成员上使用属性((visibility(“hidden”)))或#pragma GCC可见性推送(默认)。

  7. 根据基类是常规,虚拟还是纯虚拟,是否有任何要求会有所不同?

  8. 与运行时相关

    8 ..在堆栈上声明动态类或动态类的子代码是安全的,还是应该总是使用new / delete在堆上分配它们?

0 个答案:

没有答案