使用 reinterpret_cast 进行向下转换

Bla*_*ack 1 c++ performance casting downcast

我是一个喜欢深入细节的人。这次我创建了非常简单的功能,我称之为“场景”(查看代码)。首先给大家介绍一下我的看法:

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;
};
Run Code Online (Sandbox Code Playgroud)

现在示例“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);
    }

};

Run Code Online (Sandbox Code Playgroud)

在这里我得出的结论是,用户/开发人员绝对不可能获得错误类型的上下文。用在这里有错reinterpret_cast吗?如果是为什么?绝对零成本在这里非常诱人。

如果没有reinterpret_cast,那又如何static_cast

我真的对我们可以使用的所有这些“不应该”的工具感到困惑。

Ser*_*eyA 9

reinterpret_cast 永远不应该用于降低类层次结构,因为它不进行基指针调整,这在多重继承的情况下会非常困难。

static_cast如果他们可以通过某种方式确定真正的对象类型与预期的对象类型匹配,则可以(并且应该!)使用它们。static_cast当不需要调整基指针时,仍然是 0 成本,并且在需要时可以正常工作(尽管有成本)。

  • 如果层次结构需要,static_cast 将产生运行时成本(指针调整),reinterpret_cast 即使需要也不会执行调整。Dynamic_cast 提供的好处是,如果转换不适合给定的对象/类型组合,它将失败。 (2认同)