前面的文章中有讲过C++的向上转型问题,也即子转父。向上转型是没有问题的,C++允许直接转,因为在访问时,对象最多是丢弃多余的数据成员,但是向下转型就会出现内存问题。所以是不安全的,C++是不允许直接转换的,需要强制转换。
![a11f6cede8ef96c14911906c2e5bd2bf.png](https://img-blog.csdnimg.cn/img_convert/a11f6cede8ef96c14911906c2e5bd2bf.png)
C++隐式类型转换
从上图提示看子转父系统不报错,父转子直接转是不被允许的;我们用C++的强制转换强转看一下:
强制转换
C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:static_cast、reinterpret_cast、const_cast 和 dynamic_cast。具体区别后面再说。
Father* pf = new Father();pf->Age = 40 ;pf->Name = "Jordan" ;cout<Age = 12 ;pc->Name = "little Jordan" ; pc->classMateName = "jams" ;cout<(pf) ;pc = reinterpret_cast(pf);cout<
运行结果:最终pc指向了Father类的pf指针指向的父类对象;但是此时你对pc的子类对象赋值的时候就会报错,这是因为pf指向的那块内存在new时就已经分配好了的,它是没有子类自有属性classMateName的内存空间的,自然会报错;
![1d1042b0d6122f58429334ac14d2d7e7.png](https://img-blog.csdnimg.cn/img_convert/1d1042b0d6122f58429334ac14d2d7e7.png)
子转父
![439a77b36c28bac0e42de5679283294a.png](https://img-blog.csdnimg.cn/img_convert/439a77b36c28bac0e42de5679283294a.png)
父转子
几种强制类型转换
这里主要讲两种:reinterpret_cast和dynamic_cast
1、reinterpret_cast
reinterpret_cast 用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个byte的复制。
这种转换提供了很强的灵活性,但对转换的安全性不做检查,只能由程序员自己控制。例如,程序员执意要把一个 int* 指针、函数指针或其他类型的指针转换成 string* 类型的指针也是可以的,至于以后用转换后的指针调用 string 类的成员函数引发错误,程序员也只能自行处理;
pc = reinterpret_cast(pf);cout<
上面那行代码在reinterpret_cast 强制转换后,不管是否存在危险,pc都会指向父类对象的内存。
2、dynamic_cast
用 reinterpret_cast 可以将多态基类指针强制转换为子类的指针,但是这种转换不检查安全性,即不检查转换后的指针是否确实指向一个子类对象。dynamic_cast专门用于将多态基类的指针或引用强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,结果会返回 NULL 指针,程序员可以根据返回值确定是否使用该对象。
dynamic_cast 是通过运行时类型检查(RTTI)来保证安全性的。另外,dynamic_cast 不能用于将非多态基类的指针或引用强制转换为派生类的指针或引用,所以这种转换没法保证安全性,还需reinterpret_cast 来完成。
pc = dynamic_cast (pf);cout<classMateName = "old jams" ;cout<classMateName<
用dynamic_cast强转,如果存在危险,会将pc指向NULL,所以我们可以在用的时候判断一下 if(pc!=NULL),这样就能保证程序不至于直接崩溃。
3、static_cast:另外static_cast主要用于进行比较“自然”和风险比较低的类型转换工作,如整型和浮点型、字符型之间的互相转换,同样static_cast也不会做安全检查。
END
纯手KEY,希望大家多多支持小编,点个关注~~~