64,646
社区成员
发帖
与我相关
我的任务
分享
class A
{
public:
A():a(1){}
int a;
};
class B
{
public:
B():b(2){}
int b;
};
class C : public A, public B
{
public:
C():c(3){}
int c;
};
C* pC = new C();
void* pVoid = static_cast<void*>(pC);
B* pB = static_cast<B*>(pVoid);
int main(){
C* pC = new C();
B* pB;
printf("%x\n", pC);
pB = static_cast<B*>(pC);//这里会发生类型转换。。你可以看一下pC跟pB的值是不一样的。。
printf("%x\n", pB);
printf("%d\n", pB->b);
pB = reinterpret_cast<B*>(pC);//如果是这种转换。。结果跟第一种情况一样。。
printf("%x\n", pB);
printf("%d\n", pB->b);
return 0;
}
pB = static_cast<B*>(pC);
编译器知道pC指向一个C对象,知道B是C的第二个基类,也知道C的第一个基类是A,从而可以正确地将pC转换为B对象指针,转换后,pB与pC所指向的地址并不相同,pB指向pC中从B继承得到的那部分。
此外,如果编译时打开了RTTI开关,则下面的代码可以得到正确的B指针:
C* pC = new C();
void* pVoid = static_cast<void*>(pC);
B* pB = dynamic_cast<B*>(pVoid);
总之,多继承要慎用,RTTI很实用,向下映射要dynamic_cast。C* pC = new C();
void* pVoid = static_cast<void*>(pC);
B* pB = static_cast<B*>(pVoid);
pB->b = ??// 这个是1
pB = static_cast<B*>(pC);
pB-> = ?? // 这个为什么是2????
因为pB认为指向的是一个B对象,pB->b就是pB所指的B对象的偏移量为0的成员。。但实际上pB指向的是一个C对象。。在那个位置的成员是从A继承而来的a。。所以答案是1。。