何时使用dynamic_cast参考?

时间:2015-11-05 21:26:10

标签: c++

我正在阅读“C ++之旅”这本书,并且无法理解以下段落。 “不同类型是不可接受的”是什么意思?那么,何时使用指针转换以及何时使用引用转换?有人可以详细说明吗?感谢。

编辑: 另一个问题,“Difference in behavior while using dynamic_cast with reference and pointers”正在询问dynamic_cast的行为,我可以理解 - 返回nullptr或抛出异常。在这个问题中,我问的是何时使用另一个以及何时使用另一个。

  

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

2 个答案:

答案 0 :(得分:12)

基本上如果允许我们的对象是不同类型之一,我们可以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
}

这是一个想要通过分支机构或例外处理失败案件的问题。

答案 1 :(得分:5)

&#34;不可接受&#34;只是意味着&#34;不能被接受&#34;这里。具体来说,就是你自己的代码。

如果您自己的代码可以处理dynamic_cast<T*>(e)不属于*e类型的情况,您可以使用T,检查转化结果并在转换失败时执行其他操作

如果dynamic_cast<T&>(e)不属于e类型,则执行您自己的代码无法继续执行时,您可以使用T