一:
this指针调整:
class A{
public:
int a;
A(){
printf("A::A()的this指针是%p\n",this)
}
void funcA(){
printf("A::funcA()的this指针是%p\n",this)
}
}
class B{
public:
int b;
B(){
printf("B::B()的this指针是%p\n",this)
}
void funcB(){
printf("B::funcB()的this指针是%p\n",this)
}
}
class C : public A,public B{ // 先继承A 后继承B, 这个顺序会影响内存布局
public:
int c;
C(){
printf("C::C()的this指针是%p\n",this)
}
void funcC(){
printf("C::funcC()的this指针是%p\n",this)
}
}
int main(){
cout << sizeof(A) <<endl; 4字节 0x008DFE10
cout << sizeof(B) <<endl; 4字节 0x008DFE14
cout << sizeof(C) <<endl; //12字节 0x008DFE10
C myc;
myc.funcA(); // 0x008DFE10 // 这是this地址
myc.funcB(); // 0x008DFE14
myc.funcC(); // 0x008DFE10
// 派生类对象 他是包含 基类子对象的
// 如果派生类只从一个基类集成的话,那么这个派生类对象的地址和基类子对象的地址相同
// 第一个基类子对象的开始地址和派生类对象的开始地址相同
// 后续这些基类子对象的开始地址和派生类对象的开始地址相差 前面这些基类所占用的内存
// 这里可以看到 类A和类C的this指针都在相同的位置 ,所以调用funcA(), 和funcC的时候this指针不需要切换位置
// 但是当调用funcB的时候 this指针需要向下偏移4个字节调用
return 1;
}
// 同理 当我们覆盖掉类B的funcB时:
class C : public A,public B{ // 先继承A 后继承B, 这个顺序会影响内存布局
public:
int c;
C(){
printf("C::C()的this指针是%p\n",this)
}
void funcC(){
printf("C::funcC()的this指针是%p\n",this)
}
void funcB(){
printf("C::funcB()的this指针是%p\n",this)
}
}
int main(){
cout << sizeof(A) <<endl; 4字节 0x008DFE10
cout << sizeof(B) <<endl; 4字节 0x008DFE14
cout << sizeof(C) <<endl; //12字节 0x008DFE10
C myc;
myc.funcA(); // 0x008DFE10
myc.funcB(); // 0x008DFE10
myc.funcC(); // 0x008DFE10
}
/*
这里我们可以看到类ABC的this指针都调整到相同的位置,
*/
int main(){
myc.B::funcB(); //0x008DFE14
}
// 当我们调用B类的funcB的时候我们this指针会切换到B对象的地址
总结: 你调用哪个子类的成员函数,这个this指针就会被编译器自动调整到 对象内存布局中对应该子类对象的 起始位置
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交