多继承this指针的问题!

美伊小公主的奶爸 2008-12-02 02:09:14
#include <iostream>
using namespace std;

class C;
class A
{
public:
int a;
virtual void funA() ;
};
void A::funA()
{
this->a = 1;
printf("A\n");
}
class B
{
public:
int b;
virtual void funB();
};
void B::funB()
{
B *pb = this;
C *pc = (C*)this;
printf("Bthis = %x\n",this);
printf("pb = %x\n",pb);
printf("pc = %x\n",pc);
}
class C : public A,public B
{
public:
int c;
virtual void funC();
};
void C::funC()
{
printf("Cthis = %x\n",this);
printf("C\n");
}


int main()
{
C c,*pc = &c; //&c sizeof(C)
B *pb = &c;
pb->funB();
return 1;
}
这段代码输出什么?funB()函数中this,pb,pc是否相等?为什么?
...全文
195 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyvan 2008-12-02
  • 打赏
  • 举报
回复
从概念来讲,我觉得这个帖子设计到两个问题:
1. 多继承的情况下,C类的对象模型中包含着A类和B类的子对象;
2. 只要B类的指针存在,那我们就不需要知道它到底是一个“plain B”还是C类的B部分,或者是别的什么类的B部分(The Design and Evolution of C++12.4);
所以,pb本身应该是指向了C类的B部分,才会有楼上的pb,pc的不想等;

至于lz的问题,
首先,funB中的转型是类型不安全而无意义的,因为对于父类B而言
它是不应该知道自己的派生类的信息的(除非通过vbtl);
其次,指针的转型本身并不改变值的内容;
最后,最好不要直接使用C形式的强转,如果必要使用强转,用dynamic_cast, static_cast, const_cast, reinterpret_cast来指定转换的子类型会使意义更加显著,也能够让编译器提供更多的帮助;
xxgamexx 2008-12-02
  • 打赏
  • 举报
回复
void B::funB()
{
B *pb = this;
C *pc = (C*)this;
printf("Bthis = %x\n",this);
printf("pb = %x\n",pb);
printf("pc = %x\n",pc);
}

看来这里的this是 B类指针对象了~
xinustc 2008-12-02
  • 打赏
  • 举报
回复
up
papaofdoudou 2008-12-02
  • 打赏
  • 举报
回复
这是多继承中this指针漂移带来的问题!
lann64 2008-12-02
  • 打赏
  • 举报
回复
int main()
{
C c,*pc = &c; //&c sizeof(C)
B *pb = &c;
pb->funB();
cout<<hex<<pc<<endl; //要是在这里,pb和pc倒是不相等了。
cout<<hex<<pb<<endl;
return 1;
}
lann64 2008-12-02
  • 打赏
  • 举报
回复
这里只有pb->funB(); 调用了funB()里有输出。

funB()函数中this,pb,pc是否相等?当然,你仅仅用了赋值和强制类型转换,怎么会不相等呢?
wzyzb 2008-12-02
  • 打赏
  • 举报
回复
o

65,211

社区成员

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

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