法律动态_cast

Legal dynamic_cast

本文关键字:cast 动态      更新时间:2023-10-16

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

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

首先,为了合法,Y必须是指针类型。所以让我们将问题改写为CCD_ 2。做到了这一点如果X是完整的类类型,并且如果任一X是多态型,或者YX是相同的类型或者是碱基CCD_ 7类。

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

最后,有一个特殊情况(也会成功):如果X为多态型,Yvoid cv_qualifiers*。在这种情况下,dynamic_cast是否具有与dynamic_cast<Y cv_qualifiers*>( new X )0不同的语义,尽管因为从CCD_ 22返回的CCD_“指向最派生类型的指针";,实际效果将是相同的(同样,与隐式转换)。

问题应该是:

对于XY的定义,您能说些什么,以便以下代码是合法的,并且转换成功?

那么答案是相当直接的:X必须是一个完整的类型,new表达式才能合法。动态强制转换对于向上转换到非虚拟基有效,因此,如果Y是指向非虚拟基的指针(可能是CV限定的,并且包括指向X本身的指针),则强制转换有效并且成功。

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

(目前的推理比任意动态铸造更简单,因为我们已经知道种姓的动态类型。一般来说,动态铸造可以做更复杂的事情。)

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