法律dynamic_cast

时间:2012-12-02 12:04:36

标签: c++ dynamic-cast

我想知道如何解决这个问题。我不明白这个问题是什么问我:

dynamic_cast<Y>(new X)
  • 要合法吗?
  • 可能成功吗?

3 个答案:

答案 0 :(得分:3)

问题应该是:

  

您对XY的定义有何看法,以便以下代码合法,并且演员成功?

然后答案非常简单:X必须是new表达式合法的完整类型。动态转换对于向非虚拟基础的向上转换有效,因此如果Y是指向非虚拟基础的指针(可能是CV限定的,并且包括指向X本身的指针),则转换为有效成功。

此外,动态强制转换在多态类型(即具有虚函数的类)上还有其他有效用途。如果X是多态的,则Y可能是void *,或Y可能是指向X的继承层次结构中任何其他类的指针。但是,如果Y是指向基础的指针,则转换只会成功(但是,此基础可能是虚拟的!)。

(现在的推理比任意动态转换更简单,因为我们已经知道了castee的动态类型。通常,动态转换可以做更复杂的事情。)

答案 1 :(得分:3)

首先,要合法,Y必须是指针类型。那么我们 将问题重写为dynamic_cast<Y cv_qualifiers*>( new X )。这样做了,就是这样 如果X是完整的类类型,并且X是{a}},则合法 多态类型,或YX的类型相同或是基础 等级X

如果YX相同,或者是基类,则会成功 X。请注意,在这些情况下,dynamic_cast具有相同的效果 行为为static_cast,实际上对应于 隐式转换,所以通常只会写new X, 没有任何演员。 (有一些特殊情况下演员阵容 可能是必要的,通常在将结果传递给void*参数时。在这种情况下,我更愿意 static_cast,但两者的语义完全相同 同样在这种情况下。)

最后,有一个特例(也会成功):if X是多态类型,Yvoid cv_qualifiers *。在这种情况下,dynamic_cast 具有与static_cast不同的语义,但是 因为从X*返回的new X将具有该类型 “指向大多数派生类型”,实际效果 将是相同的(并且再次,与隐含的相同 转化率)。

答案 2 :(得分:1)

在不知道Y和X的情况下完全无法回答。例如,如果Y是int,那么非法。否则,如果Y是指向多态类的指针,它可能会成功,也可能不成功,但肯定没有“可能”。最后,这是一个相当讨厌的内存泄漏。