天天看點

018--C++虛基類有關記憶體的存取檢視原了解說(最優--僅供擴充)

簡介:首先你要知道虛基類為什麼能夠減少你所建立類的記憶體?因為你使用了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,派生類的記憶體變小了。

018--C++虛基類有關記憶體的存取檢視原了解說(最優--僅供擴充)

比如現在,我們的基類A有四個資料,分别為:1,2,3,4.

然後它的兩個派生類,分别為B,D.同時它們中的特有資料分别為:10,50.

最後最終派生類E,它繼承了B,D.它的特有資料為100.

下面我們根據以上實列來講解虛基類和實基類的記憶體存儲方式。(實基類:不含virtual就叫實基類)

以上我為了便于說明畫了一個記憶體結構圖:對于虛基類,它隻存取了一份基類資料,是以最後派生類隻有一份基類資料。相應資料記憶體變小。其中你看到的?代表關鍵字,即一個虛基類指針。在這裡不需要過多了解。根據自己情況去擴充。對于實基類,它存儲了兩份基類資料,相應 派生類的資料記憶體就擴大了。

代碼學習:

018--C++虛基類有關記憶體的存取檢視原了解說(最優--僅供擴充)
#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;
}      

什麼時候可以娶漂亮老婆呀············

繼續閱讀