关于指针的一点疑惑

buffonzy 2004-04-07 09:15:33
小弟最近学习COM时对指针不禁疑惑,
有请各位多多帮忙

class IX
{
public:
IX() {}
~IX() {}
};

class IY
{
public:
IY() {}
~IY() {}
};

class CA: public IX, public IY
{
public:
CA() {}
~CA() {}
};

void main()
{
CA* pCA= new CA();

IX* pIX= NULL;
IY* pIY= NULL;

printf( "%x\n", pCA );
printf( "%x\n", pIX );
printf( "%x\n", pIY );

pIX= ( IX* )pCA;
pIY= ( IY* )pCA;

printf( "%x\n", pCA );
printf( "%x\n", pIX );
printf( "%x\n", pIY );

delete pCA;
}

输出:
431dc0
0
0
431dc0
431dc0
431dc1//???

相关的书上也说 ( IX* )pCA!=( IY* )pCA 却没详述原因
还请指教
另外还想知道指针除了存储4个字节的地址值外,还有没有其他地方存储它的类型

多谢多谢!
...全文
48 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
txdyjsyz 2004-04-08
  • 打赏
  • 举报
回复
25: void main()
26: {
00401080 push ebp
00401081 mov ebp,esp
00401083 push 0FFh
00401085 push offset __ehhandler$_main (0041420b)
0040108A mov eax,fs:[00000000]
00401090 push eax
00401091 mov dword ptr fs:[0],esp
00401098 sub esp,68h
0040109B push ebx
0040109C push esi
0040109D push edi
0040109E lea edi,[ebp-74h]
004010A1 mov ecx,1Ah
004010A6 mov eax,0CCCCCCCCh
004010AB rep stos dword ptr [edi]
27: CA* pCA= new CA();
004010AD push 8
004010AF call operator new (00403a30)
004010B4 add esp,4
004010B7 mov dword ptr [ebp-20h],eax
004010BA mov dword ptr [ebp-4],0
004010C1 cmp dword ptr [ebp-20h],0
004010C5 je main+54h (004010d4)
004010C7 mov ecx,dword ptr [ebp-20h]
004010CA call @ILT+10(CA::CA) (0040100f)
004010CF mov dword ptr [ebp-2Ch],eax
004010D2 jmp main+5Bh (004010db)
004010D4 mov dword ptr [ebp-2Ch],0
004010DB mov eax,dword ptr [ebp-2Ch]
004010DE mov dword ptr [ebp-1Ch],eax
004010E1 mov dword ptr [ebp-4],0FFFFFFFFh
004010E8 mov ecx,dword ptr [ebp-1Ch]
004010EB mov dword ptr [ebp-10h],ecx
28: pCA->x = 1;
004010EE mov edx,dword ptr [ebp-10h]
004010F1 mov dword ptr [edx],1
29: pCA->y = 2;
004010F7 mov eax,dword ptr [ebp-10h]
004010FA mov dword ptr [eax+4],2
30:
31: IX* pIX= NULL;
00401101 mov dword ptr [ebp-14h],0
32: IY* pIY= NULL;
00401108 mov dword ptr [ebp-18h],0
33:
34: cout<<pCA<<endl;
0040110F push offset @ILT+30(endl) (00401023)
00401114 mov ecx,dword ptr [ebp-10h]
00401117 push ecx
00401118 mov ecx,offset cout (004299b0)
0040111D call ostream::operator<< (00401610)
00401122 mov ecx,eax
00401124 call @ILT+0(ostream::operator<<) (00401005)
35: cout<<pIX<<endl;
00401129 push offset @ILT+30(endl) (00401023)
0040112E mov edx,dword ptr [ebp-14h]
00401131 push edx
00401132 mov ecx,offset cout (004299b0)
00401137 call ostream::operator<< (00401610)
0040113C mov ecx,eax
0040113E call @ILT+0(ostream::operator<<) (00401005)
36: cout<<pIY<<endl;
00401143 push offset @ILT+30(endl) (00401023)
00401148 mov eax,dword ptr [ebp-18h]
0040114B push eax
0040114C mov ecx,offset cout (004299b0)
00401151 call ostream::operator<< (00401610)
00401156 mov ecx,eax
00401158 call @ILT+0(ostream::operator<<) (00401005)
37:
38: pIX= ( IX* )pCA;
0040115D mov ecx,dword ptr [ebp-10h]
00401160 mov dword ptr [ebp-14h],ecx
39: pIY= ( IY* )pCA;
00401163 cmp dword ptr [ebp-10h],0
00401167 je main+0F4h (00401174)
00401169 mov edx,dword ptr [ebp-10h]
0040116C add edx,4
0040116F mov dword ptr [ebp-30h],edx
00401172 jmp main+0FBh (0040117b)
00401174 mov dword ptr [ebp-30h],0
0040117B mov eax,dword ptr [ebp-30h]
0040117E mov dword ptr [ebp-18h],eax
40:
41: cout<<pCA<<endl;
00401181 push offset @ILT+30(endl) (00401023)
00401186 mov ecx,dword ptr [ebp-10h]
00401189 push ecx
0040118A mov ecx,offset cout (004299b0)
0040118F call ostream::operator<< (00401610)
00401194 mov ecx,eax
00401196 call @ILT+0(ostream::operator<<) (00401005)
42: cout<<pIX<<endl;
0040119B push offset @ILT+30(endl) (00401023)
004011A0 mov edx,dword ptr [ebp-14h]
004011A3 push edx
004011A4 mov ecx,offset cout (004299b0)
004011A9 call ostream::operator<< (00401610)
004011AE mov ecx,eax
004011B0 call @ILT+0(ostream::operator<<) (00401005)
43: cout<<pIY<<endl;
004011B5 push offset @ILT+30(endl) (00401023)
004011BA mov eax,dword ptr [ebp-18h]
004011BD push eax
004011BE mov ecx,offset cout (004299b0)
004011C3 call ostream::operator<< (00401610)
004011C8 mov ecx,eax
004011CA call @ILT+0(ostream::operator<<) (00401005)
44:
45: delete pCA;
004011CF mov ecx,dword ptr [ebp-10h]
004011D2 mov dword ptr [ebp-28h],ecx
004011D5 mov edx,dword ptr [ebp-28h]
004011D8 mov dword ptr [ebp-24h],edx
004011DB cmp dword ptr [ebp-24h],0
004011DF je main+170h (004011f0)
004011E1 push 1
004011E3 mov ecx,dword ptr [ebp-24h]
004011E6 call @ILT+20(CA::`scalar deleting destructor') (00401019)
004011EB mov dword ptr [ebp-34h],eax
004011EE jmp main+177h (004011f7)
004011F0 mov dword ptr [ebp-34h],0
46: }
freefalcon 2004-04-07
  • 打赏
  • 举报
回复
这是由于多继承造成的
CA中的内存结构包含了CX和CY二者,pCX指向CX部分,所以和pCA相等,pCY指向CY部分,所以不等

下面的代码更清楚一点
class IX
{
public:
IX() {}
~IX() {}
int x;
};

class IY
{
public:
IY() {}
~IY() {}
int y;
};

class CA: public IX, public IY
{
public:
CA() {}
~CA() {}
};

void main()
{
CA* pCA= new CA();
pCA->x = 1;
pCA->y = 2;

IX* pIX= NULL;
IY* pIY= NULL;

printf( "%x\n", pCA );
printf( "%x\n", pIX );
printf( "%x\n", pIY );

pIX= ( IX* )pCA;
pIY= ( IY* )pCA;

printf( "%x\n", pCA );
printf( "%x\n", pIX );
printf( "%x\n", pIY );

delete pCA;
}
输出为:
431da0
0
0
431da0
431da0
431da4

你可以观察一下内存

64,654

社区成员

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

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