深入理解C++对象模型:this指针调整
#include <iostream>
using namespace std;
//class A {
//
//public:
// void fun1() {}; //类的成员函数不占用类对象的内存空间,所以这是sizeof(a)还是1
// void fun2() {};
// void fun3() {};
//
// int ab;
//
//};
//
//
//int main()
//{
// A a;
// a.ab = 1;
// int ilen = sizeof(a);
// cout << ilen << endl; //sizeof(a),为什么空类=1而不等于0?
// return 0;
//}
//类的成员函数不占用类对象的内存空间
//我们可以知道以下几点:
//1成员函数不占用类对象的内存空间
//2一个类对象至少占用1个字节的内存空间
//3成员变量是包含在每个对象中的,是占用对象字节的,而成员函数虽然也是在类的定义中,但是成员函数不占用对象的字节数(内存空间);
//4成员函数每个类只诞生一个(跟着类走),不管用这个类产生了多少个对象;
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 //继承顺序决定子类的内存布局
{
public:
int c;
C()
{
printf("C::C()的this指针是:%p\n", this);
}
void funcC()
{
printf("C::funcC()的this指针是:%p\n", this);
}
};
int main()
{
//this指针调整:多重继承
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
C myc;
myc.funcA();
myc.funcB();
myc.funcC();
return 0;
}
可以发现父类的this指针和子类的this指针是一样的:
内存示意图:
总结:
1、派生类对象,它是包含基类子对象的
2、如果派生类只从一个基类继承的话,那么这个派生类对象的地址和基类子对象的地址相同;
3、但如果派生类对象同时继承多个基类,那么,第一个基类子对象的开始地址与派生类对象的开始地址相同;
4、后续这些基类子对象的开始地址派生类对象的开始地址相差多少呢?就是把之前的基类子对象所占用的内存空间去掉;
5、调用哪个对象的成员函数,this指针就会被编译器自动调整到对象内存布局中对应该子类对象的起始地址去。所以当在c类对象调用B类或者A类对象的成员函数时,this指针会与相应类对象地址相同