3

我正在开发一个项目,该项目有 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 宏的某些部分是否创建了一个从我的类或其他东西继承的类?

4

1 回答 1

3

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

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

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

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

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

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

于 2012-10-02T05:23:31.830 回答