将父类的const引用转换为派生的子对象

时间:2019-11-27 23:09:44

标签: c++ visual-studio pointers memory

我的程序中有很多事件都继承自Entity。我正在努力弄清楚如何将其转换回诸如MouseMovedEvent之类的子级。 Entity作为 const Entity& e,我需要一些方法来访问MouseMovedEvent中的getter。我当时以为可以将Entity投射到MouseMovedEvent,但是我尝试了6种不同的效果方式。

最坏的情况是,我正在考虑将Event的参数设置为const Event* e,然后进行

const MouseMovedEvent* childEvent = static_cast<const MouseMovedEvent*>(e);

这会起作用,但我担心抛出指针会变得有些混乱。我希望使const引用方法起作用(或者甚至只是引用,因为我不需要它们是恒定的),但是我不确定如何实现此目的。

对于完成父事件对象的传递有任何帮助或指导。

1 个答案:

答案 0 :(得分:1)

要回答直接的问题:您可以像投射指针一样完全投射引用。

const MouseMovedEvent& childEvent = static_cast<const MouseMovedEvent&>(e);

但是,当从父辈投射到孩子时,您几乎总是希望使用dynamic_cast。请注意,如果强制转换错误,dynamic_cast将引发std::bad_cast异常(这是一件好事,因为否则会导致您的程序开始执行完全未定义的“随机”事情)

还值得注意的是,您不应该这样做。您应该始终与具有与您进行交互的方法的类进行交互。如果您需要对孩子投掷,几乎可以肯定的是您以尴尬的方式进行了设计,并且设计更加简洁。既然您已经确定要使用事件,那么解决方案通常类似于Event->dispatch(),它会以MouseMovedEvent的身份发射到MouseMovedEventHandler中。