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個字節。。。
- 更復雜的多層繼承