C++通过指针来访问成员的过程,实际上是根据指针的类型,找到改类定义,并从中找到要访问的成员的地址偏移,然后从对象指针开始加上偏移,便得到了成员的地址,然后进行访问操作。
所以类定义的作用之一在于,确定成员的内存偏移。
static_cast会在编译期将指针在类的内存空间内移动,并最终指向到你转换到的内存上。在上面的例子中,当将CDerived*的指针转型为Y*型指针时,实际上将指针的数值修改了,指向了内存中Y类的开头位置。当使用转换后的指针访问Y的成员时,先到Y类定义查到Y的内存分布,然后进行指针便宜,访问。一切都是正确的。
reinterpret_cast并不会在转型是修改指针的值,而是告诉编译期,这个指针是某个类型的指针,仅此而已。所以当使用此转型方式转换CDerived*的指针到Y*类型时,指针仍然指向原来的位置,即CDerived*的开头,也是A*的开头。这时如果访问Y*的成员y,那么先到Y上查到y的地址偏移为一个整型的字节大小(一般是4),那么你实际是将指针偏移到了X类的x成员处,访问的是x的内容。这种错误是编译器不明白的,你的程序即将崩溃。
所以,请谨慎使用reinterpret_cast。
reinterpret_cast与static_cast的区别
最新推荐文章于 2024-08-21 17:26:37 发布