我想通过示例了解dynamic_cast 必须或应该在static_cast上使用的时间。我读过this SO question,但它并没有提供任何具体的例子。我假设大多数示例都涉及多态类类型。目前我知道使用dynamic_cast而不是static_cast的唯一原因是我不是100%肯定我正在使用的具体类型。
其他一些想法:
“如果型号未知”的原因是唯一的原因吗?如果没有,有人可以举例说明为什么dynamic_cast必须或应该在static_cast上使用?
答案 0 :(得分:2)
一般情况下,在a中转换时应使用dynamic_cast
等级,无论如何。一个可能的例外是从a转换
派生类到基类(当然是指针或引用)。除此以外,
关于你在层次结构中使用static_cast
的唯一时间是
分析师说你必须。
static_cast
或从void*
转换时,经常使用 static_cast<double>( someInt )
,
或者确保空指针常量的正确类型,或者用于
转换不涉及指针或引用(例如
{{1}})。
答案 1 :(得分:0)
即使您知道动态类型是从虚拟基础转换为更多派生类型时必须使用dynamic_cast
的一种情况:
struct A { };
struct B : virtual A { };
struct C : virtual A { };
struct D : B, C { };
A * p = new D;
D * q = dynamic_cast<D*>(p);
原因当然是虚拟基础仅在运行时确定。
dynamic_cast
的另一个用途是通过casting to void*
发现最派生对象的地址,尽管这是否是必要的语言功能并不完全清楚。 (我设法contrive a use case,但主要是学术上的。)