c++ - 虚拟析构函数使得需要在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 放置实现)。但我的问题是为什么添加虚拟析构函数会导致这种链接器错误?
解决方案
制作纯虚拟的东西并不意味着它没有实现。实现纯虚函数是完全合法的(有时也很有用)。
如果foo() = 0;
您没有在任何地方显式调用IX::foo()
,因此没有实现是可以的。它不能被隐式调用,因为它总是会被覆盖。
析构函数是不同的。它们总是被父级析构函数隐式调用。所以你需要一个析构函数的实现,即使它是纯 virtual。
推荐阅读
- python - django for loop on html 无法检索其 object_lists 的每个数据字段
- python - 如何在 conv2d (PyTorch) 中动态更改内核的大小?
- typescript - 打字稿:对象初始化时动态计算的字段
- ruby - On Array of Hashes 需要在 ruby 中同时创建其他密钥对时计算值
- smali - 如何用 Smali 语言将两个字符串附加在一起?
- sql - 在配置触发器时更新表中的列时出现错误
- dbus - 无法从 dbus NetworkManager 获取 HwAddress
- mysql - 如何知道 Node.JS Mysql 连接是否结束
- flutter - 如何显示来自多个帐户的名称?
- python-3.x - cv2: HoughLinesPointSet 在一个简单的例子中失败