Virtual destructor使得在VS2017上需要导出接口

Virtual destructor makes it necessary to export the interface on VS2017

我有一个 C++ 接口,让我们用一些方法调用它 IX

class IX
{
public:
   virtual void foo() = 0;
   virtual void bar() = 0;
}

此接口位于库(dll) 中,但考虑到它不包含任何实现,因此尚未导出。

但是,如果我想向这个接口添加一个虚拟析构函数,如下所示,然后 VS2017 链接器会抱怨找不到析构函数的实现:

class IX
{
public:
   virtual ~IX() = 0;
   virtual void foo() = 0;
   virtual void bar() = 0;
}

链接器错误:

Error   LNK2019 unresolved external symbol "public: virtual __cdecl IX::~IX(void)" (??1IX@@UEAA@XZ) referenced in function "public: virtual __cdecl B::~B(void)" (??1B@@UEAA@XZ)    test_project

一个解决方案可能是导出接口(并可能为 dtor 放置 =default 实现)。但我的问题是为什么添加虚拟析构函数会导致此类链接器错误?

制作纯虚拟的东西并不意味着它没有实现。实现纯虚函数是完全合法的(有时有用)。

foo() = 0; 的情况下,您不会在任何地方显式调用 IX::foo(),因此没有实现是可以的。它不能被隐式调用,因为它总是被覆盖。

析构函数不同。它们将始终被链中的父析构函数隐式调用。所以你需要一个析构函数的实现 即使它是纯虚拟的.