C++ 在套接字上传递具有父类的类时,只传递父类

C++ 在套接字上传递具有父类的类时,只传递父类,c++,inheritance,serialization,C++,Inheritance,Serialization,我使用boost序列化,我序列化了JoinPlayerPacket类并通过套接字传递该类,然后我接受并反序列化并尝试获取JoinPlayerPacket类变量,但它没有定义,只显示一个空字符串,但当我尝试获取父Packet类变量时,一切顺利 //Client (send) JoinPlayerPacket packet{"maxrskiy"}; packet.send_packet(sock_client.sock); //Server(accept) char

我使用boost序列化,我序列化了
JoinPlayerPacket
类并通过套接字传递该类,然后我接受并反序列化并尝试获取
JoinPlayerPacket
类变量,但它没有定义,只显示一个空字符串,但当我尝试获取父
Packet
类变量时,一切顺利

//Client (send)

JoinPlayerPacket packet{"maxrskiy"};
    packet.send_packet(sock_client.sock);

//Server(accept)

char buf[4096];
int bytesReceived = recv(clientSocket, (char*)buf, 4096, 0);
std::stringstream ss = std::stringstream(buf);
boost::archive::text_iarchive ia{ ss };
JoinPlayerPacket packet;
ia >> packet;
std::cout << packet.type << std::endl; // outputs the variable correctly
std::cout << packet.playerId << std::endl; // outputs an empty string
//客户端(发送)
JoinPlayerPackage数据包{“maxrskiy”};
packet.send_packet(sock_client.sock);
//服务器(接受)
char-buf[4096];
int bytesReceived=recv(clientSocket,(char*)buf,4096,0);
std::stringstream ss=std::stringstream(buf);
boost::archive::text_iarchive ia{ss};
JoinPlayerPacket包;
ia>>数据包;
如果不提供数据,很难看到发生了什么。特别是模板实现丢失了,你认为它们是吗?
enum PacketType {
    JoinPlayer,
    LeavePlayer
};

class Packet {
public:
    PacketType type;
    Packet(PacketType type) {
        this->type = type;
    }
    Packet() {}

    template <typename Archive>
    void serialize(Archive& ar, const unsigned int version) { ar& type; }
};

class JoinPlayerPacket : public Packet {
public:
    std::string playerId; 

    JoinPlayerPacket(std::string playerId) : Packet(PacketType::JoinPlayer) {
        this->playerId = playerId;
    }
    JoinPlayerPacket() : Packet(PacketType::JoinPlayer) {}

    void send_packet(SOCKET sock) {
        std::stringstream ss;
        text_oarchive oa{ ss };
        oa << this;
        send(sock, ss.str().c_str(), ss.str().length(), 0);
    }

    template <typename Archive>
    void serialize(Archive& ar, const unsigned int version) { ar& playerId; ar& type; }
};

class LeavePlayerPacket : public Packet {
public:
    std::string playerId;

    LeavePlayerPacket(std::string playerId) : Packet(PacketType::LeavePlayer) {
        this->playerId = playerId;
    }
    LeavePlayerPacket() : Packet(PacketType::JoinPlayer) {}

    void send_packet(SOCKET sock) {
        std::stringstream ss;
        text_oarchive oa{ ss };
        oa << this;
        send(sock, ss.str().c_str(), ss.str().length(), 0);
    }

    template <typename Archive>
    void serialize(Archive& ar, const unsigned int version) { ar& playerId; ar& type; }
};