深度探索C++对象模型(13)——数据语义学(3)——单类继承下数据成员布局

1.单一继承下的数据成员布局

代码1:

#include 
#include 
using namespace std;

class FAC //父类
{
public:
	int m_fai;
	int m_faj;
};
class MYACLS :public FAC //子类
{
public:
	int m_i;
	int m_j;
};

int main()
{
	printf("FAC::m_fai = %d\n", &FAC::m_fai);
	printf("FAC::m_faj = %d\n", &FAC::m_faj);

	printf("MYACLS::m_fai = %d\n", &MYACLS::m_fai);
	printf("MYACLS::m_faj = %d\n", &MYACLS::m_faj);
	
	printf("MYACLS::m_i = %d\n", &MYACLS::m_i);
	printf("MYACLS::m_j = %d\n", &MYACLS::m_j);
}

运行结果:

深度探索C++对象模型(13)——数据语义学(3)——单类继承下数据成员布局_第1张图片

内存布局图:

父类FAC

深度探索C++对象模型(13)——数据语义学(3)——单类继承下数据成员布局_第2张图片

子类MYACLS

深度探索C++对象模型(13)——数据语义学(3)——单类继承下数据成员布局_第3张图片

结论:

(1)一个子类对象,所包含的内容,是他自己的成员,加上他父类的成员的总和;
(2)从偏移值看,父类成员先出现,然后才是孩子类成员。

代码2:

#include 
#include 
using namespace std;
class Base //sizeof = 8字节;
{
public:
	int m_i1;
	char m_c1;
	char m_c2;
	char m_c3;
};

int main()
{
	cout << sizeof(Base) << endl;   //8字节,数据布局(内存排列上)紧凑;
	printf("Base::m_i1 = %d\n", &Base::m_i1);
	printf("Base::m_c1 = %d\n", &Base::m_c1);
	printf("Base::m_c2 = %d\n", &Base::m_c2);
	printf("Base::m_c3 = %d\n", &Base::m_c3);
}

运行结果:

深度探索C++对象模型(13)——数据语义学(3)——单类继承下数据成员布局_第4张图片

内存布局图:

类Base

你可能感兴趣的:(C++对象模型)