【博客41】static_cast与dynamic_cast的 "下转型"差别

内容: 今天记录下c++的四个常见转换中的static_cast和dynamic_cast在对类对象进行下转型的时候会出现的不同做法。

思考:
1.static_cast和dynamic_cast在上转型都是安全的,那么在下转型不安全情况下会怎么样?
2.dynamic_cast的安全体现在哪里呢?
3.dynamic对指针和引用分别有什么不同的做法
4.多态机制与dynamic_cast的工作流程中有什么交集?没有多态机制行不行?

代码一:static_cast的下转型【博客41】static_cast与dynamic_cast的 "下转型"差别

代码一结果:下转型成功,但是如果此时你去使用子类指针访问子类特定成员会出错,因为实际指向的对象是父类对象,因此static_cast下转型是不安全的。那么dynamic_cast又会有什么不同的做法呢?看下面代码二吧!

代码二及运行结果:dynamic_cast的下转型
【博客41】static_cast与dynamic_cast的 "下转型"差别

【博客41】static_cast与dynamic_cast的 "下转型"差别
结果:dynamic_cast进行检查,发现不允许下转型,于是下转型失败,同时返回空指针。避免了你使用不符合规范的指针,导致未知错误。因此通过dynamic_cast的转换结果是不是空可以判断转换是否是符合要求的,以此来避免使用错误指针,提高了安全性。

代码三:dynamic_cast对引用的下转型情况

在看代码结果之前先思考下,指针下转型失败会返回空指针,那么引用呢? 返回空引用吗?引用能是空的吗?
【博客41】static_cast与dynamic_cast的 "下转型"差别
结果:
【博客41】static_cast与dynamic_cast的 "下转型"差别
结果:的确是不能返回空引用的,毕竟引用是非空的,而且在实际使用引用的时候是不用判断空引用的,因此不可能返回空引用。实际做法是:抛出异常,由于我没有捕捉,所以程序结束。

稳妥的做法:对引用的下转型,要捕捉异常,避免程序异常终止
【博客41】static_cast与dynamic_cast的 "下转型"差别
【博客41】static_cast与dynamic_cast的 "下转型"差别
结果分析:可以看到之前没有对引用的下转型进行异常捕捉,导致程序在下转型失败后,抛出了异常,程序终止了。如果你并不想你的程序异常终止,那么你就要去捕捉它,并相应给出提示或者处理方法。

代码四:dynamic_cast在没有多态机制的情况下使用
【博客41】static_cast与dynamic_cast的 "下转型"差别
结果:编译报错,不允许你在基类没有虚函数的情况下使用。原因是:没有多态机制,那么没有虚函数表,但是编译器为类生成的信息标志是存在虚函数表的第一项,是一个指针,指向一个类型对象,里面存放了编译器为有虚函数表的这个类生成的相关类型信息。而dynamic_cast的检查是运行期检查,依赖这个信息,如果没有多态,就没办法进行检查,没办法判断类型信息。

总结:
1.static_cast和dynamic_cast在上转型是安全的。
2.下转型要使用dynamic_cast,并对转换结果进行判断,以确定是否成功
3.dynamic_cast对引用转换如果失败,会抛出异常哦!!
4.dynamic_cast要跟多态配合使用

大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。