首页 > 解决方案 > 虚拟析构函数使得需要在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

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

标签: c++linker-errorsdestructordllexport

解决方案


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

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

析构函数是不同的。它们总是被父级析构函数隐式调用。所以你需要一个析构函数的实现,即使它是纯 virtual


推荐阅读