You need to enable JavaScript to run this app. C++中如何将派生类指针序列化为接口类类型对象
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 21:48:04