仅有虚函数/内联函数的类不需要导出吗?

5
在Win32上的C++中:
假设我有一个DLL,其中包含一个声明类的头文件。该DLL导出了某些获取该类实例的指针/引用的方法,例如工厂函数。
如果只打算在其实例上调用虚拟或内联函数,那么我是否正确地认为不需要使用__declspec标记该类作为导出类?
相反,如果希望调用非虚拟成员函数,是否需要导出类声明?
4个回答

7
我正确地认为,如果只打算在其实例上调用虚拟或内联函数,则不需要使用 __declspec 将该类标记为导出吗?
是的,这是正确的,这就是 COM 所做的,DLL 只导出 4 个方法之一返回到类工厂,其中所有成员都是纯虚函数。
相反,如果希望调用静态定义的成员函数,是否需要导出类声明?
不需要,只需导出静态成员函数。

1
C++名称修饰对于编写跨编译器模块化的成功构成了负担,只需声明您想要公开的类作为仅包含虚函数的接口即可。具有虚函数的类的布局可能会“标准化”,可以考虑COM。

1

只有当函数/类的所有定义都在头文件中时,才不需要导出。

它与虚拟性无关。

因此,如果您没有导出所有类,则只要它没有任何公共或受保护的函数定义在cpp文件中,客户端代码就可以使用它。

您还可以仅声明要导出的特定成员函数,而不是整个类,方法是在函数声明中使用__declspec而不是在类名声明中使用。


“它不依赖于虚拟性”。不是吗?如果一个函数是虚拟的,那么它将通过vptr/vtable调用。例如,COM对象并不导出每个(甚至任何)方法实现。 - ChrisW
是的,但COM对象会导出vptr表本身。 - jmucchiello
不是这样的:相反,COM对象本身包含指向其自己vtable的指针(因此,任何拥有COM对象实例的人都不需要链接到COM对象的导出函数,甚至不需要链接到它的vtable)。 - ChrisW

1
我认为是的,但是:
- 你应该测试一下(我现在无法测试) - 你可能要小心使用内联方法:因为如果稍后更改它们,则必须重新构建依赖于(已使用)此类的每个其他组件(即,DLL不再完全隔离或自包含...内联方法在单个DLL中是可以的,但如果在导出的DLL接口中使用,则容易导致“DLL地狱”)。
相反,如果想调用静态定义的成员函数,是否有必要导出类声明?
如果不是整个类,则至少需要导出这些单个静态方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接