class Point3d { public: virtual ~Point3d(){}; Point3d(){x=1;y=0;z=0;}; private: float x,y,z; }; Point3d* p3=new Point3d; float* pf=reinterpret_cast<float*>(p3);
我们都知道不能这么转换,但是为什么不能呢?
父类和子类的指针可以做类型转换,那么他们为什么可以转换呢?
类型转换的本质什么呢?
为什么可以或者不可以?这个和c++对象模型如何结合?
什么叫转换,就是把被转换的对象的byte形式以你需要的类型表现出来前。
你这样强制转换实际上是能转换的,只是转换的不是你要的结果而已。
至于把子类转换成父类,原因子他们存在共同的地方,指针能够找到正确的byte偏移并复制给用来保存转换后是对象。当然子类扩展的方法成员就不行了,原因是父类型找不到正确的便宜了。他没办法知道子类扩展了什么。
转换的本质就是指针偏移和byte转换。
兄台不妨看看C++编程思想,里面的范型数据结构,其实就是用char类型来把各种数据类型以char类型数组的形式转换并保存起来。需要的时候在取出。为什么用char,因为C++没有byte这个类型,并且C++李一切类型都是字节的整数倍,当然可以用来转换存储为CHAR数据,char其实就是一个长度为byte的内存buff
C++ STL的本质也是如此的。看完C++编程思想前面几张,你就知道了。
手机上的 就没敲代码说明了
转是可以转换的,不过这样转换后没有实际的操作意义
转为一个其他指针主要是需要访问对象的方法或成员什么的,转成float*起不了这些作用
参考http://product.china-pub.com/198915 这本书,对C++的整个的对象布局等有详细解析,看了这个后,你就知道对象的切片,vtbl布局等相关的内容了
你得先明白 reinterpret_cast 、static_cast,dynmic_cast,const_cast 这几个关键字的作用和机制。
Point3d* p3=new Point3d;
float* pf=(float*)(p3);
你会发现,它是可以转换的,没有语法错误,也没有运行时错误。
// 我们都知道不能这么转换,但是为什么不能呢?
可以这么转换啊
// 父类和子类的指针可以做类型转换,那么他们为什么可以转换呢?
只要转换到的类型是指针类型,编译器都不会报错的。这是强制转换,可以转的。
// 类型转换的本质什么呢?
类型转换的本质(个人理解):
就是让编译器把原有类型看成新的类型去处理。就这么简单,比如上例。p3对应的地址处本来是个类Point3d,占用内存4*(1+3)个字节,如果把p3强制转换成float型的pf,那么编译器会把该地址(pf指向的地址)当作float型对待,大小是4字节。仅此而已。