法律动态_cast
Legal dynamic_cast
我想知道如何解决这个问题。我不明白这个问题在问我什么:
dynamic_cast<Y>(new X)
- 合法吗
- 可能成功吗
首先,为了合法,Y
必须是指针类型。所以让我们将问题改写为CCD_ 2。做到了这一点如果X
是完整的类类型,并且如果任一X
是多态型,或者Y
与X
是相同的类型或者是碱基CCD_ 7类。
如果Y
与X
相同,或者是CCD_ 10。注意,在这些情况下,dynamic_cast
具有相同的行为为static_cast
,实际上对应于隐式转换,所以通常只写new X
,没有任何铸件。(在一些特殊情况下,演员通常在将结果传递给void*
参数时可能是必要的。在这种情况下,我更愿意static_cast
,但两者的语义正是在这种情况下也是一样。)
最后,有一个特殊情况(也会成功):如果X
为多态型,Y
为void
cv_qualifiers*
。在这种情况下,dynamic_cast
是否具有与dynamic_cast<Y
cv_qualifiers*>( new X )
0不同的语义,尽管因为从CCD_ 22返回的CCD_“指向最派生类型的指针";,实际效果将是相同的(同样,与隐式转换)。
问题应该是:
对于
X
和Y
的定义,您能说些什么,以便以下代码是合法的,并且转换成功?
那么答案是相当直接的:X
必须是一个完整的类型,new
表达式才能合法。动态强制转换对于向上转换到非虚拟基有效,因此,如果Y
是指向非虚拟基的指针(可能是CV限定的,并且包括指向X
本身的指针),则强制转换有效并且成功。
此外,动态类型转换在多态类型(即具有虚拟函数的类)上还有其他有效用途。如果X
是多态的,则Y
可以是void *
,或者Y
可以是指向X
的继承层次结构中的任何其他类的指针。但是,只有当Y
是指向基的指针时,强制转换才会成功(但是,此基可能是虚拟的!)。
(目前的推理比任意动态铸造更简单,因为我们已经知道种姓的动态类型。一般来说,动态铸造可以做更复杂的事情。)
在不知道Y和X的情况下,它是完全无法回答的。例如,如果Y是int,那么它就是非法的。否则,如果Y是一个多态类的指针,它可能会成功,也可能不会,但肯定没有什么"可能"。最后,这是一个相当严重的内存泄漏。
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何理解C++标准N3337中的expr.const.cast子句8
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- C++Cast运算符过载
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本