首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

替虾米?为虾米!

2013-07-01 
为虾米?为虾米!!!!!类的定义如下:class A{public:A():a(1){}int a}class B{public:B():b(2){}int b}cl

为虾米?为虾米!!!!!
类的定义如下:

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;
};


执行如下代码后,pB->b = ?为虾米??
C* pC = new C();
void* pVoid = static_cast<void*>(pC);
B* pB = static_cast<B*>(pVoid);



[解决办法]
[code=c++]
B* pB = static_cast<B*>(pVoid)
[/code]
编译器不知道pVoid指向什么东西,无法正确地从pVoid转换成为B指针,只是简单地进行了一次类型的变化,实际上pB与pVoid指向同一内存位置。

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????

Quote: 引用:

因为pB认为指向的是一个B对象,pB->b就是pB所指的B对象的偏移量为0的成员。。但实际上pB指向的是一个C对象。。在那个位置的成员是从A继承而来的a。。所以答案是1。。


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;
}

热点排行