4

我想知道何时必须应该在 static_cast 上使用 dynamic_cast,并附上示例。我读过这个 SO question,但它并没有真正提供任何具体的例子。我假设大多数示例将涉及多态类类型。目前我知道在 static_cast 上使用 dynamic_cast 的唯一原因是如果我不能 100% 确定我正在使用的具体类型。

其他一些想法:

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

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

4

2 回答 2

2

一般来说,dynamic_cast在层次结构中转换时应该使用,无论如何。一个可能的例外是从派生类转换为基类(当然是指针或引用)。static_cast否则,您在层次结构中使用的唯一时间是分析器说您必须使用的时候。

static_cast更常用于与 a 相互转换void*,或确保空指针常量的类型正确,或用于不涉及指针或引用的转换(例如 static_cast<double>( someInt ))。

于 2012-10-01T16:37:08.710 回答
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是通过强制转换来发现派生最多的对象的地址tovoid*,尽管这是否是必要的语言特性尚不完全清楚。(我设法设计了一个用例,但它主要是学术性的。)

于 2012-10-01T16:47:41.123 回答