读书人

C++类型转换的疑义

发布时间: 2012-10-15 09:45:25 作者: rapoo

C++类型转换的疑问
在Windows 32位系统下:
int i;
转换成char c = (char*)i;
会把int(4个字节)切割成char(1个字节),但是&c和&i是相等的,也就是转换并没有导致指针的偏移。

对于下面的转换:
class Base1
{
int base1;
};
class Base2
{
int base2;
};
class Derived : public Base1, public Base2
{
int derived;
};

Derived* pDerived = new Derived;
Base2* pBase2 = (Base2*)pDerived; // 指针发生了偏移,pDerived与pBase2不是同一个地址,如下图所示:


编译器在进行类型转换的时候:是不是对于C++的内建类型都不会进行指针的偏移,但是对于用户定义的类型会进行指针的偏移呢?

[解决办法]
<<Inside the C++ Object Model>>
[解决办法]
因为Derived中有一个Base1,一个Base2,这个地方的强转相当于调用了static_cast,
会得出这个类中的Base2的首地址。

如果有个函数void some_fun(Base2 *),你传入一个Derived *
你也会发现这个值变了,这里也是隐含调用了static_cast

读书人网 >C++

热点推荐