C++中如何将派生类指针序列化为接口类类型对象
C++ 基类无数据成员场景下的序列化实现方案
核心思路
利用C++多态特性,只需要在抽象接口层定义统一的序列化契约,具体实现完全交给派生类处理即可,无数据成员的基类不需要实现任何序列化逻辑。
具体实现步骤
- 第一步:在
Interface抽象类中添加纯虚的serialize方法,作为所有派生类必须实现的序列化接口,同时注意补充虚析构函数避免内存泄漏。
#include <ostream> class Interface { public: virtual ~Interface() = default; // 纯虚序列化接口,可根据需求调整入参,比如传入自定义缓冲区、文件路径等 virtual void serialize(std::ostream& output) const = 0; // 原有其他抽象虚方法保留即可 };
- 第二步:各个派生类自行实现
serialize方法,仅处理自身持有的数据成员的序列化逻辑,可额外写入类型标识方便后续反序列化时识别对象类型。
#include <string> class Derived1 : public Interface { private: int int_val; std::string str_val; public: void serialize(std::ostream& output) const override { // 可选:写入类标识,反序列化时用于判断创建哪种派生类对象 output << "Derived1 "; // 序列化自身所有成员变量 output << int_val << " " << str_val.size() << " " << str_val; } }; class Derived2 : public Interface { private: double double_val; long long long_val; public: void serialize(std::ostream& output) const override { output << "Derived2 "; output << double_val << " " << long_val; } };
- 第三步:通过基类指针直接调用
serialize方法即可,多态机制会自动调度到对应派生类的实现逻辑。
int main() { Interface* base_ptr1 = new Derived1(); Interface* base_ptr2 = new Derived2(); // 直接调用基类指针的序列化方法即可 base_ptr1->serialize(std::cout); base_ptr2->serialize(std::cout); delete base_ptr1; delete base_ptr2; return 0; }
补充说明
- 如果需要支持反序列化,可以额外实现一个工厂方法,读取序列化内容中的类型标识后创建对应派生类实例,再调用派生类的反序列化方法填充数据即可。
- 无数据成员的接口类不需要参与任何序列化逻辑,仅作为统一的接口约束存在即可。
内容的提问来源于stack exchange,提问作者ionyy
相关产品推荐
相关产品推荐

