何时使用引用的dynamic_cast?

10
我正在阅读《C++之旅》一书,但无法理解以下段落。什么是“不接受不同类型”?那么,何时使用指针转换,何时使用引用转换?有人能详细说明一下吗?谢谢。
编辑: 另一个问题,“使用动态转换时,使用引用和指针的行为差异”是在问动态转换的行为,我可以理解-返回nullptr或抛出异常。在这个问题中,我想问什么时候使用其中一个,什么时候使用另一个。
引用自《C++之旅》,第4.5.3节:“当指向不同派生类对象的指针是有效参数时,我们使用dynamic_cast到指针类型。然后我们测试结果是否为nullptr。这个测试通常方便地放在变量初始化的条件中。当不接受不同类型时,我们可以直接将dynamic_cast转换为引用类型。如果对象不是预期类型,则会抛出bad_cast:”
2个回答

16

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

这只是想要通过分支或异常来处理失败情况的问题。


std::bad_cast - Marco Kinski

5
“不可接受”在这里的意思是“不能被接受”。具体而言,是指通过您自己的代码。
如果您的自己的代码可以处理*e*不是类型*T*的情况,并检查转换的结果并在转换失败时执行其他操作,则可以使用dynamic_cast<T*>(e)
如果您自己的代码的执行不能有意义地继续,如果*e*不是类型*T*,则可以使用dynamic_cast<T&>(e)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接