class base1
;
virtual ~base1(void){}
int getibase() const
static int instancecount()
virtual void print()const{}
private:
int ibase;
static int icount;
};
下面是編譯器的結果:
建立乙個類所需要的空間為
私有資料+需表指標
所有類之間共享
靜態變數 , 靜態函式 成員函式,虛函式(_vptr指向的虛表)
下面是繼承:
不是虛繼承,所以是擴充已存在的虛函式表. print 函式被重寫,新虛函式被新增到虛表後面.
base1* p = &a;
多重繼承
從單繼承可以知道,派生類中只是擴充了基類的虛函式表。如果是多繼承的話,又是如何擴充的?
1) 每個基類都有自己的虛表。
2) 子類的成員函式被放到了第乙個基類的表中。
3) 記憶體布局中,其父類布局依次按宣告順序排列。
4) 每個基類的虛表中的print()函式都被overwrite成了子類的print ()。這樣做就是為了解決不同的基類型別的指標指向同乙個子類例項,而能夠呼叫到實際的函式。
單虛繼承 保留了基類的虛表
在虛繼承中,派生類和基類的資料,是完全間隔的,先存放派生類自己的虛函式表和資料,中間以
0x
分界,最後儲存基類的虛函式和資料。如果派生類過載了父類的虛函式,那麼則將派生類記憶體中基類虛函式表的相應函式替換
普通多重繼承
多重虛繼承 上下兩圖對比一下就知道虛繼承是怎麼回事了.
c 記憶體模型
1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static全域性變數和靜態變數的存放區域。初始化的全域性變數和...
C 記憶體模型
1.在c 中,不要在標頭檔案中進行變數宣告。因為單定義規則的存在,不同原始檔中對於同乙個全域性變數只能夠定義一次。因此如果在標頭檔案中包含變數定義,那麼很有可能使用相同標頭檔案的原始檔會對這個變數產生多次定義。2.new 與 delete等通過動態分配記憶體產生的資料將儲存在堆 heap 中。3.在...
C記憶體模型
程式執行時作業系統把磁碟的 load到記憶體,然後分配給該程序乙個記憶體空間,分為堆區,棧區,全域性區和 區如圖1所示。作業系統找到main函式開始執行程式。圖1 記憶體模型 區 存放程式的二進位制 全域性區 全域性變數和靜態變數。初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始...