小结1


#include <iostream>
using namespace std;
class a
{
public:
a(
int x=0){this->x=x;}
virtual void show(){}
int x;
};
class b
{
public: b(int y=0){this->y=y;}
void show(){}
int y;
};
class c:public a,public b
{
public:
c(
int x,int y,int z):a(x),b(y),z(z){}
void show(){}
int z;
};
int main()
{
c cc(
1,2,3);
a
*a1=&cc;
b
*b1=&cc;
delete b1;
// cout<<a1->x<<" "<<b1->y<<endl;
cout<<cc.x<<cc.y<<cc.z<<endl;
}
26
    a *a1=&cc;
27
    b *b1=&cc;
不要误以为a1和b1的地址是一样哦。
查看了汇编代码
 
56: a *a1=&cc;
004015B6 lea eax,[ebp
-0Ch]
004015B9 mov dword ptr [ebp
-10h],eax
57: b *b1=&cc;
004015BC lea ecx,[ebp
-0Ch]
004015BF test ecx,ecx
004015C1 je main
+3Bh (004015cb)
004015C3 lea edx,[ebp
-8]
004015C6 mov dword ptr [ebp
-18h],edx
004015C9 jmp main
+42h (004015d2)
004015CB mov dword ptr [ebp
-18h],0
004015D2 mov eax,dword ptr [ebp
-18h]
004015D5 mov dword ptr [ebp
-14h],eax
可知a1 和b1的地址经过编译器内部处理的!
27     b *b1=&cc;
该操作所连带的"必要this指针的调整",必须在执行期完成。
b1向后调整了sizeof(a)个字节到b类的存储地址了。
posted on 2011-04-20 10:35  wf110  阅读(117)  评论(0编辑  收藏  举报