类型转换到抽象类
Type-casting to an abstract class?
我正在编写一个基于事件的消息传递系统,用于在我的游戏项目中的各个单例管理器之间。 每个管理器类型(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
。也就是说,您正在尝试将指向一个类的指针强制转换为另一个类的实例。当然,这是没有道理的。
可以将指向派生类实例的指针强制转换为指向其基类之一的实例的指针。我想这就是你的本意。
- E0322:不允许使用抽象类类型 " " 的对象
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 分配抽象类类型 c++ xcode 的对象
- 分配抽象类类型为"CObject"的对象
- 错误消息:不允许抽象类类型 "X" 的对象:纯虚拟"Y"没有覆盖器
- 错误:不允许使用抽象类类型的对象
- 表达式到C++类类型转换器/类型转换
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- OOP - 抽象类类型,初始化基类和派生类中的变量
- 创建一个抽象类类型的集合,shared_ptr的抽象类向量
- 意外地'instantiate'使用大括号初始值设定项的抽象类类型?
- C++错误:不允许使用抽象类类型的对象
- 使用 std::vector 时抽象类类型"Shape"的新表达式无效错误
- 提升::可选抽象类类型
- 不允许抽象类类型的对象 "Vector<LinkedList<int>>"
- 在我的代码中分配抽象类类型的对象
- 使用抽象类类型的 c++ 传递对象会给出错误:不是 GeneralDriverInterface 的成员
- 模板类类型转换
- 分配抽象类类型的对象
- 视窗 - FMX - 无效的类类型转换C++