首页 新闻 会员 周边

C++类型转换

0
悬赏园豆:20 [已解决问题] 解决于 2013-08-25 22:08
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++对象模型如何结合?

何合的主页 何合 | 初学一级 | 园豆:177
提问于:2013-08-20 22:00
< >
分享
最佳答案
0

什么叫转换,就是把被转换的对象的byte形式以你需要的类型表现出来前。

你这样强制转换实际上是能转换的,只是转换的不是你要的结果而已。

至于把子类转换成父类,原因子他们存在共同的地方,指针能够找到正确的byte偏移并复制给用来保存转换后是对象。当然子类扩展的方法成员就不行了,原因是父类型找不到正确的便宜了。他没办法知道子类扩展了什么。

转换的本质就是指针偏移和byte转换。

兄台不妨看看C++编程思想,里面的范型数据结构,其实就是用char类型来把各种数据类型以char类型数组的形式转换并保存起来。需要的时候在取出。为什么用char,因为C++没有byte这个类型,并且C++李一切类型都是字节的整数倍,当然可以用来转换存储为CHAR数据,char其实就是一个长度为byte的内存buff

C++ STL的本质也是如此的。看完C++编程思想前面几张,你就知道了。

手机上的 就没敲代码说明了

收获园豆:10
大芝麻 | 初学一级 |园豆:4 | 2013-08-21 08:46
其他回答(3)
0

转是可以转换的,不过这样转换后没有实际的操作意义

转为一个其他指针主要是需要访问对象的方法或成员什么的,转成float*起不了这些作用

参考http://product.china-pub.com/198915 这本书,对C++的整个的对象布局等有详细解析,看了这个后,你就知道对象的切片,vtbl布局等相关的内容了

收获园豆:3
2012 | 园豆:21230 (高人七级) | 2013-08-21 08:34
0

你得先明白 reinterpret_cast 、static_cast,dynmic_cast,const_cast 这几个关键字的作用和机制。

 

Point3d* p3=new Point3d;
float* pf=(float*)(p3);

你会发现,它是可以转换的,没有语法错误,也没有运行时错误。

收获园豆:3
Launcher | 园豆:45045 (高人七级) | 2013-08-21 09:14
0

// 我们都知道不能这么转换,但是为什么不能呢?

可以这么转换啊

 

// 父类和子类的指针可以做类型转换,那么他们为什么可以转换呢?

只要转换到的类型是指针类型,编译器都不会报错的。这是强制转换,可以转的。

 

// 类型转换的本质什么呢?

类型转换的本质(个人理解):

就是让编译器把原有类型看成新的类型去处理。就这么简单,比如上例。p3对应的地址处本来是个类Point3d,占用内存4*(1+3)个字节,如果把p3强制转换成float型的pf,那么编译器会把该地址(pf指向的地址)当作float型对待,大小是4字节。仅此而已。

收获园豆:4
编程难 | 园豆:206 (菜鸟二级) | 2013-08-21 10:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册