深度探索c++對象模型(四)

1. 單一繼承下數據成員佈局

引入繼承關係後,可能會帶來內存空間的額外增加(字節對齊)

class A
{
public:
	int a;
	int b;
	char c;
	char d;
};


int main() {

	cout << sizeof(A) << endl;

	return 0;
}
  • 結果:
    在這裏插入圖片描述
class A
{
public:
	int a;
	int b;
};

class B:public A
{
public:
	char b;
};

class C :public B
{
public:
	char c;
};

int main() {

	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;

	return 0;
}
  • 結果:
    在這裏插入圖片描述

在這裏插入圖片描述

2. 單一繼承(父類帶、不帶虛函數)的成員佈局

class A
{
public:
	int m_a;
	virtual void funA() {};
};

class B : public A
{
public:
	int m_b1;
	int m_b2;
	virtual void funB() {};
};

int main()
{


	B b;
	cout << sizeof(B) << endl;
	printf("A::m_a= %d\n", &A::m_a);
	printf("B::m_b1= %d\n", &B::m_b1);
	printf("B::m_b2= %d\n", &B::m_b2);

	b.m_a = 1;
	b.m_b1 = 2;
	b.m_b2 = 3;


	return 0;
}
  • 結果:
    在這裏插入圖片描述

地址佈局:
在這裏插入圖片描述
在這裏插入圖片描述

3. 多層繼承數據佈局

class A
{
public:
	int m_a;
	virtual void funA() {};
};

class B
{
public:
	int m_b;
	virtual void funB() {};
};

class C :public A, public B
{
public:
	int m_c;
	virtual void funC() {};
};

int main()
{


	C c;
	cout << sizeof(C) << endl;
	printf("A::m_a= %d\n", &C::m_a);
	printf("B::m_b= %d\n", &C::m_b);
	printf("C::m_c= %d\n", &C::m_c);

	c.m_a = 1;
	c.m_b = 2;
	c.m_c = 3;


	return 0;
}
  • 結果:
    在這裏插入圖片描述

地址佈局:
在這裏插入圖片描述
在這裏插入圖片描述

注:父類指針指向子列對象,父類指針的地址被調整爲子類中父類對象地址

C c;
	
B* b = &c;
  • c對象的地址:
    在這裏插入圖片描述
  • b指針指向的地址
    在這裏插入圖片描述

可以看出b指向的地址向下調整了8個字節。。。

  • 更復雜的多層繼承
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章