提升最终子类错误的基类的序列化

Boost serialization of base class of final subclass error

本文关键字:基类 序列化 错误 子类      更新时间:2023-10-16

我正在尝试使用 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++代码来检测它们。