为虾米?为虾米!!!!!

pbdwadr 2013-06-08 07:02:33
类的定义如下:
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);


...全文
147 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-06-09
  • 打赏
  • 举报
回复
int main(){ C* pC = new C(); B* pB; printf("%x\n", pC); pB = dynamic_cast<B*>(pC);//这里正是 dynamic_cast的用武之地。 printf("%x\n", pB); printf("%d\n", pB->b); return 0; }
hugett 2013-06-08
  • 打赏
  • 举报
回复
引用 4 楼 pbdwadr 的回复:
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????
引用 3 楼 hugett 的回复:
因为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;
}
橡木疙瘩 2013-06-08
  • 打赏
  • 举报
回复
[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。
pbdwadr 2013-06-08
  • 打赏
  • 举报
回复
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????
引用 3 楼 hugett 的回复:
因为pB认为指向的是一个B对象,pB->b就是pB所指的B对象的偏移量为0的成员。。但实际上pB指向的是一个C对象。。在那个位置的成员是从A继承而来的a。。所以答案是1。。
hugett 2013-06-08
  • 打赏
  • 举报
回复
因为pB认为指向的是一个B对象,pB->b就是pB所指的B对象的偏移量为0的成员。。但实际上pB指向的是一个C对象。。在那个位置的成员是从A继承而来的a。。所以答案是1。。
pbdwadr 2013-06-08
  • 打赏
  • 举报
回复
基本功。。。。。。。。
qq453345496 2013-06-08
  • 打赏
  • 举报
回复
不知道。。。但是为什么要这么使用,C++把转换的关键词弄那么丑就是不希望用到的吧
【资源介绍】 基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip基于Bootstrap + LayUI + SSM的仿虾米音乐系统项目.zip 【备注】 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载,欢迎沟通,互相学习,共同进步!提供答疑!

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧