我正在处理一个项目,该项目有 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/