【问题标题】:Virtual destructor makes it necessary to export the interface on VS2017虚拟析构函数使得需要在VS2017上导出接口
【发布时间】:2021-11-06 19:18:31
【问题描述】:

我有一个 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 实现)。但我的问题是为什么添加虚拟析构函数会导致这种链接器错误?

【问题讨论】:

  • 工作here。能否提供minimal reproducible example
  • @NutCracker 是的,我知道在单个文件中它可以正常工作。但是,正如我所提到的,接口应该在 dll 中定义并在其外部使用。

标签: c++ linker-errors destructor dllexport


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 2011-03-03
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多