什么时候/应该使用dynamic_cast而不是static_cast?

时间:2012-10-01 16:32:02

标签: c++ casting

我想通过示例了解dynamic_cast 必须应该在static_cast上使用的时间。我读过this SO question,但它并没有提供任何具体的例子。我假设大多数示例都涉及多态类类型。目前我知道使用dynamic_cast而不是static_cast的唯一原因是我不是100%肯定我正在使用的具体类型。

其他一些想法:

  • 横向投射(多重继承)
  • 转换为虚拟继承层次结构中的基类
  • 在使用多重继承的类中转换为“最正确”的继承类型时,指针是否会更改(如果使用static_cast)?

“如果型号未知”的原因是唯一的原因吗?如果没有,有人可以举例说明为什么dynamic_cast必须或应该在static_cast上使用?

2 个答案:

答案 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*发现最派生对象的地址,尽管这是否是必要的语言功能并不完全清楚。 (我设法con­trive a use case,但主要是学术上的。)