我正在阅读“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节
答案 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
。