何时使用引用的dynamic_cast
When to use dynamic_cast of reference?
我正在读《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)
来继续执行自己的代码。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理