从父级到子级的dynamic_cast问题

Issues with dynamic_cast from parent to child

本文关键字:cast dynamic 问题      更新时间:2023-10-16

我在一个基本的客户端服务器应用程序在c++使用套接字,将运行一个游戏的战舰。客户端和服务器之间的所有通信都以简单的对象层次结构的形式进行,看起来像这样:

namespace Message {
    enum MessageType { BASE, RESULT };
    class BattleshipMessage {
    public:
        virtual MessageType get_type() { return BASE; }
        virtual ~BattleshipMessage() {}
    };
    class ResultMessage : public BattleshipMessage {
    public:
        char _attackResult;
        ResultMessage( char result ) : _attackResult( result ) {}
        virtual MessageType get_type() { return RESULT; }
        ~ResultMessage() {}
    };
}

当接收到通过套接字发送的对象时,我希望能够将其作为泛型BattleshipMessage接收,然后基于get_type()返回的MessageType将其强制转换为适当的子类,以检索处理消息可能需要的任何附加信息。我担心c#已经让我变软了,因为我已经用像ResultMessage result = message as ResultMessage这样简单的语法做了这种事情,但是我仍然试图让我的c++实现工作。

BattleshipMessage* message;
recv( hAccepted, reinterpret_cast<char*>( &message ), sizeof(message), 0 );
switch ( message->get_type() ) {
case RESULT:
    if ( ResultMessage* result = dynamic_cast<ResultMessage*>(message)) {
        std::string celebration = "HOORAY!";
    }
    break;
}

当我解引用指针并尝试调用get_type()时,我得到Access violation reading location。有人能给我指个方向吗?

sizeof(message)

给出了指针的大小,通常是32位或64位,具体取决于您的机器。你想要

sizeof(BattleshipMessage)

给出类的大小。即使这样,我也不确定这是正确的方法,因为每个类对象都将包含一个指向处理动态调度/虚函数调用的虚函数表的指针,并且使用您使用的原始强制转换方法跨机器发送类将使该指针无效。

我认为你应该首先序列化你的对象(即转换成一个字符流),然后通过网络发送它,然后反序列化重建类:有可能在c++中序列化和反序列化一个类吗?

去掉所有的虚方法,并将MessageType作为成员变量存储在BattleshipMethod中。那么你的代码应该可以工作了。