提升最终子类错误的基类的序列化
Boost serialization of base class of final subclass error
我正在尝试使用 boost::serialization
序列化一个类,但是当派生类声明为 final
时它失败了。
#include <fstream>
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/archive/binary_oarchive.hpp>
class Base {
public:
virtual ~Base() = default;
virtual void Foo() = 0;
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& archive, const unsigned int version) {}
};
class Derived final: public Base {
public:
void Foo() override {}
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& archive, const unsigned int version) {
archive & boost::serialization::base_object<Base>(*this);
}
};
int main() {
Derived foo;
std::ofstream output("output");
boost::archive::binary_oarchive archive(output);
archive << foo;
}
error: cannot derive from ‘final’ base ‘Derived’ in derived type ‘boost::detail::is_virtual_base_of_impl<Base, Derived, mpl_::bool_<true> >::boost_type_traits_internal_struct_X’
struct boost_type_traits_internal_struct_X : public Derived, virtual Base
如果省略final
指定器,则没有错误。此错误的原因是什么以及如何避免此错误?
原因是 is_virtual_base_of
是 Boost 的一个实现细节,它试图从其参数中导出(通过比较大小(以确定一个类是否是另一个类的虚拟基础。
在撰写本文时,没有final
类,因此没有考虑此案。您可能想在 Boost 邮件列表中询问是否有人可以增强/修复它,这可能是也可能是不可能的。Boost传统上尽最大努力检测类型特征,但可以做的事情是有限的。大多数编译器都有内置方法来确定某些类型属性,因为无法仅使用C++代码来检测它们。
相关文章:
- 虚拟基类初始化
- 如何防止在基类初始化器中调用默认构造函数?
- 类序列化方法
- 如何在派生类中存储基类初始化期间获得的信息
- Boost:当缺少类型时,如何通过基指针序列化/反序列化泛型类型集合
- 是否可以在基类初始化器列表中传递成员对象
- 多重继承、复制构造函数和基类初始化
- 继承和复制构造函数-如何从基类初始化私有字段
- 从基类模板化列表中实例化子类对象
- 事件类序列化
- 从基类模板化虚拟方法,而不是使用重载
- 在使用虚拟继承时,我可以避免重复的基类初始化吗
- 用基类模板化的静态方法(aka.Factory)派生类
- 基类初始化器和成员变量初始化器的顺序重要吗
- 用自己的类序列化QHash
- 在初始化列表中基类初始化之前调用函数
- 虚拟基类初始化
- 尽管类名与C++完全匹配,但模板基类初始化构造函数失败
- 在Boost (c++)中没有类跟踪的派生类序列化
- 增强类序列化,更改成员类型