簡介:首先你要知道虛基類為什麼能夠減少你所建立類的記憶體?因為你使用了virtual 這個關鍵字,使得你所建立類有了新的記憶體存取方式。比如,你沒有使用virtual,那麼你所建立的類所包含的基類記憶體有重複,是以導緻派生類記憶體變大。那麼如果你使用了virtual,也就在記憶體中,僅有一份基類記憶體,是以你所建立的派生類也就相應記憶體變小了。
C語言中的記憶體存儲資料的存儲方式:
在這裡給大家補充以下c語言中記憶體的存取方式。它是16進制存取的。比如現在有一個變量為:int i=4407873;那麼對于i這個變量,它的記憶體是怎樣的。首先要使得4407873轉換為16進制的數,為:434241.相當于0X00434241(這個16進制數開頭是數字0和大寫字母X).當你得到這個16進制數,相應的你要把這個16進制數存儲在計算機中,那麼這裡存儲很關鍵,它的存儲方式是先存取41,在存取42,再存取43,最後存取00.這幾個存取的數相應為:A,B,C,\n.是以cout<<(char*)&i<<endl;所的結果為ABC.給大家講解記憶體存儲方式,是為了友善我們去了解虛基類的記憶體存儲方式,以此知道為什麼用了virtual,派生類的記憶體變小了。
比如現在,我們的基類A有四個資料,分别為:1,2,3,4.
然後它的兩個派生類,分别為B,D.同時它們中的特有資料分别為:10,50.
最後最終派生類E,它繼承了B,D.它的特有資料為100.
下面我們根據以上實列來講解虛基類和實基類的記憶體存儲方式。(實基類:不含virtual就叫實基類)
以上我為了便于說明畫了一個記憶體結構圖:對于虛基類,它隻存取了一份基類資料,是以最後派生類隻有一份基類資料。相應資料記憶體變小。其中你看到的?代表關鍵字,即一個虛基類指針。在這裡不需要過多了解。根據自己情況去擴充。對于實基類,它存儲了兩份基類資料,相應 派生類的資料記憶體就擴大了。代碼學習:
#include<iostream>
using namespace std;
class CA{
public:
int temp;
int a;
int b;
int c;
public:
CA(int src){
temp = 1;
cout << src<< " CA()" << endl;
a = 2;
b = 3;
c = 4;
}
~CA(){
cout << "~CA()" << endl;
}
};
class CB:virtual public CA{
public:
int temp;
public:
CB():CA(1234){
temp = 12;
cout<< " CB()" << endl;
}
~CB(){
cout << "~CB()" << endl;
}
};
class CD :virtual public CA{
public:
int temp;
public:
CD():CA(5000){
temp = 50;
cout <<" CD()" << endl;
}
~CD(){
cout << "~CD()" << endl;
}
};
class CE :public CB,public CD{
public:
int temp;
public:
CE():CA(9999){
temp = 100;
cout <<" CE()" << endl;
}
~CE(){
cout << "~CE()" << endl;
}
};
int main(){
CE e;
CE *pe = &e;
//int i = 4407873;
//cout << (char*)&i << endl;//輸出結果ABC
return 0;
}