我想知道如何解决这个问题。我不明白这个问题是什么问我:
dynamic_cast<Y>(new X)
答案 0 :(得分:3)
问题应该是:
您对
X
和Y
的定义有何看法,以便以下代码合法,并且演员成功?
然后答案非常简单: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}},则合法
多态类型,或Y
与X
的类型相同或是基础
等级X
。
如果Y
与X
相同,或者是基类,则会成功
X
。请注意,在这些情况下,dynamic_cast
具有相同的效果
行为为static_cast
,实际上对应于
隐式转换,所以通常只会写new X
,
没有任何演员。 (有一些特殊情况下演员阵容
可能是必要的,通常在将结果传递给void*
参数时。在这种情况下,我更愿意
static_cast
,但两者的语义完全相同
同样在这种情况下。)
最后,有一个特例(也会成功):if
X
是多态类型,Y
是void
cv_qualifiers *
。在这种情况下,dynamic_cast
具有与static_cast
不同的语义,但是
因为从X*
返回的new X
将具有该类型
“指向大多数派生类型”,实际效果
将是相同的(并且再次,与隐含的相同
转化率)。
答案 2 :(得分:1)
在不知道Y和X的情况下完全无法回答。例如,如果Y是int,那么非法。否则,如果Y是指向多态类的指针,它可能会成功,也可能不成功,但肯定没有“可能”。最后,这是一个相当讨厌的内存泄漏。