Skip to content

Latest commit

 

History

History
83 lines (68 loc) · 2.27 KB

03.this指针调整.md

File metadata and controls

83 lines (68 loc) · 2.27 KB

this指针调整

在c++中多继承过程,根据访问不同的父类成员变量或者是成员函数,同一个实例对象会出现不同的基址(对象的地址,类似于你在不同的场合就会有身份的转换,在家的身份,在学校,在公司的等等),这种现象叫做this指针基址调整。

#include <iostream>
using namespace std;

class A
{
public:
	A() {
		printf("A::A()的this指针是:%p\n", this);
	}
	void funcA() { 
		printf("A::funcA:this = %p\n", this);
	}
	int a;
};

class B
{
public:
	B() {
		printf("B::B()的this指针是:%p\n", this);
	}
	void funcB() {
		printf("B::funcB:this = %p\n", this);
	}
	int b;
};

class C : public A, public B
{
public:
	C() {
		printf("C::C()的this指针是:%p\n", this);
	}
	void funcC() {
		printf("C::funcC:this = %p\n", this);
	}
	int c;
};

int main()
{
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;
	C myc;
	myc.funcA();
	myc.funcB();
	myc.funcC();
}
4
4
12
A::A()的this指针是0019FBD0
B::B()的this指针是0019FBD4
C::C()的this指针是0019FBD0
A::funcAthis = 0019FBD0
B::funcBthis = 0019FBD4
C::funcCthis = 0019FBD0

观察得知

  • myc的sizeof是12,因为C类继承了A类和B类,所以C类也有A类和B类的成员,算上C类自己则有三个整型成员变量,所以为12字节
  • 接着行的结果是执行代码行 myc; 所致 这里要注意,执行的个类的构造函 数,父类(基类 )A 类构造函数的 this 指针与父类 类构造函数的 this 指针不同,差了4个字节,而类构造函数的 this 指针与类构造函数的 this 指针相同.

在执行funcB的时候,this指针从原来的 0019FBD0 调整到 0019FBD4,这属于编译器内部自动调整这个this指针,而在执行funcC时,this指针又调回到 0019FBD0

子类先继承了A类再继承了B类,所以子类C的this指针才跟父类A一样。为了获取B的成员变量,这时this指针需要偏移字节数为sizeof(A),所以A,B的地址差了4个字节

image-20211125222036582

参考