没有必要导出只有虚拟/内联函数的类?

时间:2009-02-14 23:29:10

标签: c++ winapi dll

在Win32上的C ++中:

假设我有一个带有头文件的DLL,它声明了一个类。 DLL导出一些获取指向该类实例的指针/引用的方法,例如工厂函数。

我是否正确认为如果仅在其实例上调用虚函数或内联函数,则不必使用__declspec将该类标记为导出?

相反,如果想要调用非虚拟成员函数,是否有必要导出类声明?

4 个答案:

答案 0 :(得分:7)

  

我是否正确认为如果仅在其实例上调用虚函数或内联函数,则不必使用__declspec将该类标记为导出?

是的,这是正确的,这就是COM所做的,DLL只发布了4个方法,其中一个返回到类工厂,其所有成员都是纯虚函数。

  

相反,如果希望调用静态定义的成员函数,是否有必要导出类声明?

不,只需导出静态成员函数。

答案 1 :(得分:1)

仅当函数/类在头文件中具有所有定义时才有必要。 它不依赖于虚拟性。

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

通过在函数声明中使用__declspec而不是在类名声明中,您也可以只声明要导出的特定成员函数而不是整个类。

答案 2 :(得分:1)

  

我是否相信......

是的,我想是的,但是:

  • 你应该测试一下(我现在不能)

  • 您可能想要提防使用内联方法:因为如果您稍后更改它们,那么您应该重建依赖于(已经构建)此类的所有其他组件(即DLL不再完整-insulated或self-contained ...内联方法在单个DLL中是可以的,但如果在DLL的导出接口中使用,则有助于某种“DLL地狱”。

  

相反,如果希望调用静态定义的成员函数,是否有必要导出类声明?

如果不是全班,则需要至少导出那些单独的静态方法。

答案 3 :(得分:1)

C ++名称修改是编写交叉编译器模块成功的一个负担, 只需将要公开的类声明为只包含虚函数的接口。 具有虚函数的类的布局可能是“标准化的”,可以考虑COM。