类型转换到抽象类

Type-casting to an abstract class?

本文关键字:抽象类 类型转换      更新时间:2023-10-16

我正在编写一个基于事件的消息传递系统,用于在我的游戏项目中的各个单例管理器之间。 每个管理器类型(InputManager、AudioManager 等(都派生自基管理器类,并且还继承自 EventHandler 类以方便消息处理,如下所示:

class Manager
{ ... }
class EventHandler
{ ...
    virtual void onEvent(Event& e) =0;
  ...
}
class InputManager : public Manager, public EventHandler
{ ... 
    virtual void InputManager::onEvent(Event& e);
    { ... }
}

在其他地方,我有一个事件管理器,它跟踪所有事件处理程序,并用于将事件广播到多个接收者。

class EventManager
{...
    addHandlerToGroup(EventHandler& eh);
    { ... } 
 ...
}

当然,当我初始化所有单例管理器时,我希望在创建它们时将它们添加到事件管理器的列表中。 我的问题是,每当我尝试将管理器转换为事件处理程序时,MVC++ 都会在编译时(以及我使用波浪线编码时(抱怨。 我认为它会按如下方式工作:

int main()
{ ...
    EventManager* eventM = new EventManager();
    ...
    InputManager* inputM = new InputManager();
    eventM->addHandlerToGroup(dynamic_cast<EventHandler>(inputM));
} 

但是,编译器通知我"不允许强制转换为抽象类"。 我的印象是你可以...毕竟,如果不来回传递对象,并且对解释它们的基类有多接近有一点灵活性,多态性对你没有多大好处。 我当前的解决方法如下所示:

int main()
{ ...
    EventManager* eventM = new EventManager();
    EventHandler* temp;
    ...
    InputManager* inputM = new InputManager();
    temp = inputM;
    eventM->addHandlerToGroup(*inputM);
} 

据我所知,这在概念上与我想要完成的任务相同,只是更冗长和不那么直观。 就多态性类型转换的工作原理而言,我是否完全不了解? 我哪里出错了?

EventManager 中,将方法addHandlerToGroup声明为

void addHandlerToGroup(EventHandler* handler);

然后,只需删除强制转换即可。 将指针(在示例中inputM(按原样传递给 addHandler 方法,您应该没问题:)

InputManager* inputM = new InputManager();
eventM->addHandlerToGroup(dynamic_cast<EventHandler>(inputM));

我想你只是忘记了你在做什么。在此代码中,inputM是一个InputManager*,您正在尝试将其强制转换为EventHandler。也就是说,您正在尝试将指向一个类的指针强制转换为另一个类的实例。当然,这是没有道理的。

可以将指向派生类实例的指针强制转换为指向其基类之一的实例的指针。我想这就是你的本意。