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

标签 c++ visual-studio pointers memory

我的程序中有很多事件都继承自 Entity .我正在努力弄清楚如何将其转换回其中一个 child ,例如 MouseMovedEvent . Entity被传递为 const Entity& e我需要一些方法来访问 MouseMovedEvent 中的 getter。我在想我可以投 EntityMouseMovedEvent但我已经尝试了 6 种不同的方法来达到效果。

最坏的情况我正在考虑将 Event 的参数设为 const Event* e然后做

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

这会起作用,但我担心四处乱扔指针会变得有点困惑。我希望使 const 引用方法起作用(或者甚至只是引用,因为我不需要它们是常量)但我不确定如何实现这一点。

如有任何关于如何完成传递父事件对象的帮助或指导,我们将不胜感激。

最佳答案

要回答直接的问题:您可以像转换指针一样转换引用。

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

但是,当从父对象转换到子对象时,您几乎总是希望使用 dynamic_cast。请注意,如果转换错误,dynamic_cast 将抛出一个 std::bad_cast 异常,(这是一件好事,否则它只会导致您的程序开始执行完全未定义的“随机”事物)

同样值得注意的是,您不应该这样做。您应该始终与具有与之交互所需的方法的类进行交互。如果您需要转换为 child ,几乎可以肯定您以一种尴尬的方式设计了它,并且有一种更简洁的设计。既然你已经澄清你正在使用事件,那么解决方案通常类似于 Event->dispatch(),它将自身作为 MouseMovedEvent 触发到你的 MouseMovedEventHandler

关于c++ - 将父类的 const 引用转换为派生的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59079641/

相关文章:

c++ - Windows 上的 CMake 命令 configure_file 有何不同?

visual-studio - 如何从适用于 Android 的 Visual Studio 模拟器访问 IIS Express 中本地部署的服务

c - C 中的指针变量

c++ - 代码中void(*)()是什么意思

c++ - 全局函数指针。多重定义错误

c++ - 使用if语句对3个数字排序

c# - Tab按钮在windows窗体应用程序中切换到错误的控件

visual-studio - 什么是 “Content Files”(在Visual Studio中:安装项目:文件系统

即使 IF 语句为 false,字符指针数组也会被覆盖

c++ - 使用数组作为数组元素时出错