小结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;
}
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指针的调整",必须在执行期完成。
该操作所连带的"必要this指针的调整",必须在执行期完成。
b1向后调整了sizeof(a)个字节到b类的存储地址了。
浙公网安备 33010602011771号