向上转换和向下转换:都是指针或者引用的转换,不是普通对象的转换
向上转换:子类向基类的转换,比如,derived_class d ;base_class *b = derived_class &d;
向下转换:安全性没有保障,基类向子类转换,比如,base_class b; derived_class *d = (derived_class*) &b;
我们会发现,向下转换的时候需要进行类型转化,因为&b只知道了实例b的地址和内部构造(这是base_class的构造),与derived_class的内部构造不一定相同,所以要强制转换一下
为什么说向下转换是不安全的呢
看了一些博主的文章,感觉只是讲了现象(也就是举了个例子),但是没有说明是什么原因
个人觉得应该是:用上面例子讲解一些原理
- 因为OOP的引入,指针和引用有两种类型--静态类型和动态类型(运行时类型),在声明的时候他们的类型时静态类型,当程序运行的时候,实际类型其实是动态类型,就比如上面的两种转换,类型在运行时改变了。但是普通变量只有静态类型
- 根据运行时的实际类型来调用相应的虚函数,可以理解为动态束定,多态机制能够实现就是靠虚函数
- 根据上面两点,我们可以知道多态是会根据实际类型来决定调用哪个方法的(比如基类中一个方法为虚函数,子类中相应的方法也是虚函数,即使有进行重写),假设成员方法 func1 为虚函数
- 所以上面的向下转换中,d->func1调用的是base_class的func1,就是说我们既然会进行向下转换,那肯定是想要用子类的一些东西,但是现在我们要用子类的func1,却发现调用的基类的方法,这样的话可能就会产生一些意想不到的结果----比如想用子类的func1进行一些变量的初始化,但是没有调用就会使得哪些变量没有初始化而是乱码
- 还有就是基类的东西一般是子类东西的子集,因为继承的原因,有些子类有而基类没有的方法
怎么解决:dynamic_cast
引入了dynamic_cast<type>(),父类对象向子类指针的转换(向下转换)是不安全的,用dynamic_cast<>转换会得到一个空指针.
切割问题:向上转换会出现切割问题
很直观的就是基类构造函数中的参数少于子类构造函数需要的参数,所以
derived_class d=derived_class(x,y,z) ;
base_class b = d;
base_class的参数可能只需要两个,只用到了子类的部分来对父类进行初始化
本文介绍了C++中的向上转换和向下转换,强调了向下转换的安全隐患及其原因,并提出了使用dynamic_cast作为解决方案。同时讨论了向上转换可能导致的切割问题,举例说明了这一现象。
892

被折叠的 条评论
为什么被折叠?



