c++类继承有关问题

c++类继承问题
本帖最后由 zhoucantong 于 2012-11-04 18:39:12 编辑
SmartPhone sp (10000, 800, "android");
Phone* pp = &sp;
Camara* pc = &sp;
Computer* po = &sp;
printf ("%p,%p,%p,%p\n", &sp, pp, pc, po);//pp,pc,po地址不同,为什么?
pp = reinterpret_cast<Phone*> (&sp);
pc = reinterpret_cast<Camara*> (&sp);
po = reinterpret_cast<Computer*> (&sp);
printf ("%p,%p,%p,%p\n", &sp, pp, pc, po);//而这里pp,pc,po都是sp的地址,为什么?
(SmartPhone 继承Phone,Camara,Computer)

 

------解决方案--------------------
这种转换,并不是赋值那么简单,
reinterpret_cast<>
dynamic_cast<>
这两个转换,实际上做了一个查找或者查找并检验的操作;
static_cast,const_cast 两个转换和C的转换差别不大。

------解决方案--------------------
C++ 实际上无论哪种语言,多继承的实现都不是那么简单的,每个父类对象在子类对象内部的偏移量,是不同的。
所以要在原指针的基础上,加一个偏移量或者查一下表来定位,父类对象的位置,使得转换后的指针恰好指向父类对象,如果转换失败可能会抛出异常,或者把指针赋值为NULL;
------解决方案--------------------
引用:
这种转换,并不是赋值那么简单,
reinterpret_cast<>
dynamic_cast<>
这两个转换,实际上做了一个查找或者查找并检验的操作;
static_cast,const_cast 两个转换和C的转换差别不大。
reinterpret_cast才不会做任何检查,只是单纯的二进制数据重新解释,效果类似于先取地址然后指针强转再解引用
------解决方案--------------------
reinterpret_cast<>的实现,是由编译器,而不是标准决定的。
这是C++标准,特地为编译器厂商留下的自留地。
具体效果使用以后才知道,编译器想怎么干就怎么干。
char c;
char *pc=&c;
int *pi=reinterpret_cast<int *>pc;
这个是单纯的二进制数据重新解释,没问题,其他的就不一定这样了。