c++ - boost 串行器 : getting warning C4308 unless using virtual class destructor

标签 c++ serialization boost

我正在处理一个项目,该项目有 2 个类(与我的问题相关)需要序列化。有一段时间,其中一个类编译正常,而另一个类编译时出现以下警告:

...\boost\mpl\print.hpp(51): warning C4308: negative integral constant converted to unsigned type

对于它们两个,我使用 Boost 类导出器来注册这些类,以便稍后我可以安全地将基类指针序列化为它们的实例,如下所示:

BOOST_CLASS_EXPORT_GUID(ClassName, "ClassName")

所以我慢慢消除了两个类之间的差异,发现警告的来源是这样的:安静编译的类有一个虚拟析构函数,因为我打算让其他类继承它可能需要自己的析构函数.

现在,我也只是给了另一个类一个虚拟析构函数,但由于我不打算从它继承,所以这看起来很奇怪。

我的问题是:为什么给类一个虚拟析构函数“修复”这个警告,这个警告的真正含义是什么? BOOST_CLASS_EXPORT_GUID 宏的某些部分是否创建了一个继承 self 的类或其他类的类?

最佳答案

我刚刚发布了这个问题,但我想我可能刚刚意识到至少部分解决方案。

BOOST_CLASS_EXPORT_GUID 宏旨在“注册”一个将从基类继承的类,以防需要序列化包含指向子类实例的基类指针的结构,以便序列化器可以区分指针的类型如

BaseClass* base;// = new BaseClass()
BaseClass* derived;// = new DerivedClass()

为了多态性,没有显式转换它们。

如果要继承一个类,(我认为)给它一个虚拟析构函数是最安全的,这样派生类就可以自行清理。

但是:我不打算从编译有问题的类继承,所以用 BOOST_CLASS_EXPORT_GUID 导出它没有意义。所以我收到了不良做法的警告 - 你不应该导出你以后不会继承的类。

关于c++ - boost 串行器 : getting warning C4308 unless using virtual class destructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12684829/

相关文章:

c++ - 使用带有 boost::array<char, n> 的 boost::iostreams::array_sink

c++ - 在 C++/boost 中的 *nix 中检索时间的最有效方法是什么?

c++ - 错误:'std::cout 中的 'operator<<"不匹配

java - 如果Serializable类中存在不可序列化的字段,会有什么影响?

c++ - 在 C++ 库中正确使用模板进行基于特定类型的优化

c# - 如何在 XBAP 应用程序中使用 BinaryFormatter 反序列化流?

mysql - 如何在不使用 PHP 的情况下在 MySQL 中序列化数据

c++ - mmorpg 服务器端的网络库(libuv/boost::asio?)

c++ - 在 C++ 中为指针数组定义 NULL

c++ - 使用 -flto 选项的 g++ 错误