Boost Serializer:除非使用虚拟类析构函数,否则会收到警告C4308

时间:2012-10-02 05:06:30

标签: c++ serialization boost

我正在开发一个项目,该项目有两个类(与我的问题相关)需要序列化。有一段时间,其中一个类编译得很好,另一个编译时带有以下警告:

...\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宏的某些部分是否创建了一个继承自我的类的东西?

1 个答案:

答案 0 :(得分:3)

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

BOOST_CLASS_EXPORT_GUID宏用于“注册”将从基类继承的类,如果包含指向子类实例的基类指针的结构需要序列化,则序列化程序可以区分像

这样的指针类型
BaseClass* base;// = new BaseClass()
BaseClass* derived;// = new DerivedClass()
为了多态性,

没有明确地转换它们。

如果一个类将被继承,(我认为)最安全的是给它一个虚拟析构函数,以便派生类可以自己清理。

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