一个C++的对象指针值比较问题(期待您的解决)

cnndemo 2008-10-28 01:30:32
分析一下这道程序?
class A{
int m_nA;
};
class B{
int m_nB;
};
class C{
int m_nC;
};
class D:public A,public B,public C{
int m_nD;
};
int main()
{
using namespace std;
D *pD = new D;
A *pA = dynamic_cast<A*>(pD);
B *pB = dynamic_cast<B*>(pD);

C *pC = dynamic_cast<C*>(pD);
cout << pA << endl << pB << endl << pC << endl << pD << endl;
if(pD == pA)
cout << "pD == pA" << endl;
if(pD== pB)
cout << "pC == pB" << endl;
if(pD == pC)
cout << "pD == pC" << endl;
cout << (dynamic_cast<C*>(pD) == pC) << endl;
}
运行后的结果是:
00384F20
00384F24
00384F28
00384F20
pD == pA
pD == pB
pD == pC
1
请按任意键继续. . .

他们的内存结构应该如下:
高地址
_______________
|__m_nD_______|
|__m_nC_______|<-pC
|__m_nB_______|<-pB
|__m_nA_______|<-pA,pD

低地址
所以地址是
00384F20
00384F24
00384F28
00384F20

但为什么会输出相等呢??是不是和没有定义“==”的重载有关,不甚理解,请高人指点。
我用的是VS2005
...全文
111 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
moolleychean 2008-10-28
  • 打赏
  • 举报
回复
不就是要你自己去想为什么吗
cnndemo 2008-10-28
  • 打赏
  • 举报
回复
hhyttppd让我很受启发~
感谢各位
基本上弄清楚问题了~~
不过我第一次发贴~~
没得技术分·~不好意思啊 ~~
cnndemo 2008-10-28
  • 打赏
  • 举报
回复
感谢二位,回楼上,我并不是想要那样的结果,只是不知道程序运行后为什么会出现那样的情况
matrixcl是不是说,虽然四个指针的值不同
但在c++中,由于他们在语义上都是指向pD,而导致他们比较的时候相同了呢?
这样会不会是c++内部对“==”重载的结果啊?
hhyttppd 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 moolleychean 的回复:]
if((int)pD == (int)pA)
cout < < "pD == pA" < < endl;
if((int)pD== (int)pB)
cout < < "pC == pB" < < endl;
if((int)pD == (int)pC)
cout < < "pD == pC" < < endl;

就是你想要的结果
[/Quote]

这是不对的:
C++98 13.6.15 build-in operators 中有这么一条:
对任意指针T,bool operator == (T, T)可以做为候选重载。
本例即为:bool operator == (D*, D*),这样只需要将pA转换到D*就可以最好匹配了,也即只需要一次转换就可以最好区配。
则bool operator == (int, int),则需要两次转换
显示编译器会选择bool operator == (D*, D*),故3楼的是对的。



moolleychean 2008-10-28
  • 打赏
  • 举报
回复
if((int)pD == (int)pA)
cout < < "pD == pA" < < endl;
if((int)pD== (int)pB)
cout < < "pC == pB" < < endl;
if((int)pD == (int)pC)
cout < < "pD == pC" < < endl;

就是你想要的结果
matrixcl 2008-10-28
  • 打赏
  • 举报
回复
这个问题我的了解有限。说点自己的理解,等待高人详细解答。

pD == pA 做这个比较时,会将指针pD隐式转化为A类型指针再比较。(pB == pA 因为A和B没有继承关系,无法强制转换,编译报错)

而pD转化为A类型的时使用的方式至少内部和dynamic_cast强制转换是一致的。因此才有题目中输出的结果。

如果执行 B *pB2 = pD; pB2的值和pB一样,因此猜测派生类指针(pD)赋值给基类指针(pB2)时,内部数据转化和dynamic_cast也是一致的。
cnndemo 2008-10-28
  • 打赏
  • 举报
回复
我确实是没分啊~
要怎样才能弄到技术分呢 ??
cnndemo 2008-10-28
  • 打赏
  • 举报
回复
我第一次发帖
没有分数,希望有人指点这个问题

65,210

社区成员

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

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