我正在编写一个基于事件的消息传递系统,用于我游戏项目中的各个单例管理器。每个管理器类型(InputManager,AudioManager等)都是从基类Manager类派生的,并且还继承自EventHandler类以便于消息处理,如下所示:
class Manager
{ ... }
class EventHandler
{ ...
virtual void onEvent(Event& e) =0;
...
}
class InputManager : public Manager, public EventHandler
{ ...
virtual void InputManager::onEvent(Event& e);
{ ... }
}
在其他地方,我有一个跟踪所有EventHandler的EventManager,用于向多个接收者广播事件。
class EventManager
{...
addHandlerToGroup(EventHandler& eh);
{ ... }
...
}
当我初始化我的所有单件管理器时,我想在将它们创建到EventManager列表时添加它们。我的问题是,每当我尝试将我的Managers转换为EventHandlers时,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);
}
据我所知,对于我想要完成的事情来说,概念是相同的,如果更冗长,更不直观。我是否完全偏离多态性的类型转换是如何工作的?我哪里错了?
答案 0 :(得分:4)
InputManager* inputM = new InputManager();
eventM->addHandlerToGroup(dynamic_cast<EventHandler>(inputM));
我认为你只是忘记了自己在做什么。在此代码中,inputM
是InputManager*
,您尝试将其转换为EventHandler
。也就是说,您正在尝试将指针转换为另一个类的实例。那当然没有意义。
您可以将指向派生类实例的指针强制转换为指向其某个基类的实例的指针。我认为这就是你的意思。
答案 1 :(得分:3)
,将方法EventManager
声明为
addHandlerToGroup
然后,只需删除演员。将指针(在示例中为void addHandlerToGroup(EventHandler* handler);
)原样传递给addHandler方法,你应该没问题:)