如有錯誤,歡迎指正,謝謝!!!!
一、沒有虛函數,沒有繼承的類內存結構:
1.如下定義一個類:
class A
{
public:
void seta(int x) {a = x;};
void setb(int x) {b = x;};
int sum() {return a+b;};
private:
int a;
int b;
};
二、沒有虛函數,有繼承的類內存結構:
class A
{
public:
void seta(int x){a = x;};
privated:
int a;
};
class B:class A
{
public:
void setb(int x){b = x;};
privated:
int b;
};
在這樣的實例中,先分配父類變量,再分配子類變量。
如果是多重繼承的話,則按順序分配父類的變量。
三、有虛函數,沒有繼承的類內存結構:
若果類中含有虛函數時,類對象的內存分配有不一樣的地方。如:
class A
{
public:
virtual init(int x,int y){a = x;b = y;};
virtual init(){a = 0;b=0;};
int sum();
priviate:
int a,b;
}
此時,在類實例內存中,首先是虛函數表指針,然后才分配變量。
四、有虛函數,單繼承的類內存結構:
單繼承關系分為虛函數覆蓋和不覆蓋兩種,當不覆蓋時,虛函數表先是父類的虛
函數表,然后是子類的虛函數表,當覆蓋時,同樣排序,但父類的被覆蓋虛函數
地址為子類的相應的虛函數的地址。變量的分配和上面的相同。
五、有虛函數,多繼承的類內存結構:
class C
{
public:
virtual C1(){return 1;};
virtual C2(){return 2;};
setc(int x){c = x;};
private:
int c;
};
class B
{
public:
virtual B1(){d1=1;};
virtual B2(){d2=2;};
private:
int d1;
int d2;
};
class A
{
public:
int sum(){return a1+a2;};
virtual A1(int x,int y){a1 = x;a2 = y;};
virtual A2(){a3=0;};
virtual A3(int x){a3 = x;};
virtual A4(){a1*a2*a3;};
private:
int a1;
int a2;
int a3;
};
class D:public A,public B,public C
{
public:
virtual D1(int x,int y){d1=x+10;d2=y+10;d3=d1*5;d4=d2*7;};
virtual D2(){return 8;};
private:
int d1,d2,d3,d4;
};
此時,類D 的實例的內存分配應該如下:
A的虛函數表指針,緊跟這個虛函數表的是D的虛函數地址。
A的變量分配
B的虛函數表指針
B的變量分配
C的虛函數表指針
C的變量分配
D的變量分配
如果有虛函數覆蓋,則和上面描述相同,用D的虛函數地址覆蓋相應的父類的虛
函數表中虛函數的地址。
|