我正在使用gcc和msvc。我的目标是将动态库框架作为跨多个程序的一些基本功能的集合。使用虚拟类对我来说似乎很直观,可以在大多数程序上执行默认行为,使用的虚拟函数可以被略有不同的其他程序覆盖。
我在动态库中寻找的主要理想是可以将新的导出符号添加到库中,而无需重建所有依赖二进制文件。此外,添加内部功能应该很简单。我主要担心的是连接要求。从动态库导出虚拟类或纯虚拟的一些要求是什么,以便可以编译另一个二进制文件并与子类链接?具体做法是:
什么时候需要导出整个基类?即在类声明中使用 declspec(dllexport / dllimport)或__attribute ((visibility(“default”)))。
什么时候可以从类声明中省略export属性,只能放在所需方法的前面?
是否需要导出在基类中声明为virtual的所有方法?
编译器导出的符号如何添加到基类中? (虚拟表地址和typeinfo)
编译器添加到基类的符号是否可以显式导出而不导出整个类?
在MSVC中,当导出整个类时,单个方法或成员是否可以“未导出”?类似于在单个方法/成员上使用属性((visibility(“hidden”)))或#pragma GCC可见性推送(默认)。
根据基类是常规,虚拟还是纯虚拟,是否有任何要求会有所不同?
与运行时相关
8 ..在堆栈上声明动态类或动态类的子代码是安全的,还是应该总是使用new / delete在堆上分配它们?