何时使用dynamic_cast参考?

Max*_*eap 7 c++

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

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

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

Bar*_*rry 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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们的对象必须是一个特定的类型,我们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
}
Run Code Online (Sandbox Code Playgroud)

这是一个想要通过分支或异常来处理故障情况的问题.


小智 5

"不可接受"只是意味着"不能接受".具体来说,由您自己的代码.

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

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