c++ - 使用 reinterpret_cast 向下转换
问题描述
我是一个喜欢深入细节的人。这次我创建了非常简单的功能,我称之为“场景”(在下面查找代码)。首先,我将向您介绍我对它的看法:
struct ScenarioContext
{ virtual ~ScenarioContext() = default; };
struct IScenarioStep
{
virtual ~IScenarioStep() = default;
virtual void run( ScenarioContext& ) = 0;
};
struct ScenarioContainer final
{
std::list<std::unique_ptr<IScenarioStep>> m_scenarioStepList;
};
struct Scenario
{
explicit Scenario( ScenarioContainer&&, std::unique_ptr<ScenarioContext>&& = nullptr );
void execute(); // Runs the steps one by one and passes context ref to steps
std::unique_ptr<ScenarioContext> m_context;
ScenarioContainer m_container;
};
现在示例“ScenarioStep”实现:
struct SimpleContext
: ScenarioContext
{
bool isFirstStepDone = false;
bool isSecondStepDone = false;
bool isThirdStepDone = false;
};
struct ScenarioStep
: IScenarioStep
{
void run(ScenarioContext& ctx) override
{
auto THE_ISSUE = dynamic_cast<SimpleContext&>(ctx);
}
};
在这里我得出结论,用户/开发人员绝对不可能得到错误类型的上下文。在这里用错了reinterpret_cast
吗?如果是,为什么?绝对零成本在这里非常诱人。
如果没有reinterpret_cast
,那怎么static_cast
办?
我真的很困惑我们可以使用的所有这些“不要”的工具。
解决方案
reinterpret_cast
永远不应该用于降低类层次结构,因为它不进行基指针调整,这在多重继承的情况下会非常困难。
static_cast
如果他们可以通过某种方式确定真正的对象类型与预期的对象类型匹配,则可以(并且应该!)使用。static_cast
当不需要调整基本指针时,仍然是 0 成本,并且在需要时可以正常工作(尽管有成本)。
推荐阅读
- c# - 是否有某种类型的checkedListBox ItemUnchecked/CheckChanged 事件?
- ios - NSFetchedResultsController 不知道数据已被 NSBatchUpdateRequest 更改
- angular - Fullcalendar 显示少一天的事件
- python - 使用 OpenCV 将 Hough_Circles 转换为热图
- java - Spring Boot - 不支持内容类型 'application/x-www-form-urlencoded;charset=UTF-8'
- python - 在 Flask 中找不到“静态”文件的正确路径
- javascript - 为什么 styled-jsx 标签中的变量不起作用?
- typescript - 在 Phaser3 中的场景之间切换
- python - 无法连接到 Flask-Eve API
- python - 从字符串中仅去除完全匹配的子字符串