今天编程时遇到一个问题,问题描述如下:
(1)基类Base具有私有虚函数。定义如下:
class Base
{
public:
__declspec(dllexport) Base(){}
private:
virtual test();
}
(2)Base类定义在Common模块中。
(3)子类Derived定义如下:
class Derived:public Base
{
public:
Derived():Base(){}
}
(4)Derived类定义在Specific模块中
(5)Specific模块与Common模块间采用动态链接
(6)编译时报错:未找到test()函数定义。
后来排查了一下,发现是虚函数的问题。由于在对于Derived类虚函数表进行初始化时,Specific模块对Base::test()函数进行了引用。当链接器进行符号解析时,因为在Specific模块中没有找到Base::test()的定义。所以需要在其他模块中继续查找。因为Common模块没有对Base::test()函数进行导出,所以链接器最终查找Base::test()定义失败。链接器会因此终止并输出无法解析Base::test()函数的信息。
解决办法就是将私有虚函数test()也进行导出就可以了。