何时使用引用的dynamic_cast

When to use dynamic_cast of reference?

本文关键字:cast dynamic 引用 何时使      更新时间:2023-10-16

我正在读《C++之旅》一书,无法理解下面的段落。"不同类型是不可接受的"是什么意思?那么,何时使用指针强制转换,何时使用引用强制转换呢?有人能详细说明一下吗?谢谢

编辑:另一个问题,"使用带有引用和指针的dynamic_cast时的行为差异"是询问dynamic_cast的行为,我可以理解——返回nullptr或抛出异常。在这个问题中,我问什么时候使用一个,什么时候使用另一个。

"当指向不同派生类的对象的指针是有效参数时,我们对指针类型使用dynamic_cast结果是nullptr。此测试通常可以方便地放置在条件中变量的初始化当不同类型是不可接受的,我们可以简单地将dynamic_cast转换为引用类型。如果对象不是预期的类型,则抛出bad_cast:"-C++教程,第4.5.3节

基本上,如果我们的对象被允许是不同类型的对象之一,我们可以dynamic_cast到一个指针,这样我们就可以检查强制转换是否成功:

void do_if_derived(Base& b) {
    Derived* d = dynamic_cast<Derived*>(&b);
    if (d) {
        // do something
    }
    else {
        // not a Derived, this is OK
    }
}

但是,如果我们的对象必须是一个特定的类型,我们可以dynamic_cast到一个引用,如果它碰巧是错误的,就让强制转换抛出:

void this_better_be_a_derived(Base& b)
{
    Derived& d = dynamic_cast<Derived&>(b);
    // do stuff with d
    // will throw if, e.g. b is a DifferentDerived& instead
}

这是一个想要通过分支或异常处理失败案例的问题。

此处"不可接受"仅表示"无法接受"。具体来说,通过您自己的代码。

如果您自己的代码能够处理*e不是T类型的情况,则可以使用dynamic_cast<T*>(e),方法是检查转换的结果,如果转换失败,则执行其他操作。

如果e不是T类型,则您可以使用dynamic_cast<T&>(e)来继续执行自己的代码。