C 學習筆記14 V Tables 虛繼承

2021-08-08 03:25:46 字數 1380 閱讀 7341

很感謝這位博主,寫的很棒,c++ 虛函式表解析

這位博主針對無覆蓋繼承、有覆蓋繼承、多繼承等等講的很細緻。

還有這一篇c++ 多繼承和虛繼承的記憶體布局 技術點滿滿。這一篇講的更加詳細。

還有這一篇關於記憶體布局講的很清楚c++物件記憶體布局

這一篇寫了較多的關於繼承的sixeof的問題,寫的不錯,

c++ 深入理解 虛繼承、多重繼承和直接繼承

對於虛繼承簡單來說就如下圖:

注意一定要結合這三個部落格一起學習,很棒的總結

c++的多型性用一句話概括就是:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式;如果物件型別是基類,就呼叫基類的函式

存在虛函式的類都有乙個一維的虛函式表叫做虛表,類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的

乙個類存在虛函式,那麼編譯器就會為這個類生成乙個虛表,在虛表裡存放的是這個類所有虛函式的位址。當生成類物件的時候,編譯器會自動的將類物件的前四個位元組設定為虛表的位址,而這四個位元組就可以看作是乙個指向虛表的指標。虛表裡依次存放的是虛函式的位址,每個虛函式的位址佔4個位元組。

1虛函式表是全域性共享的元素,即全域性僅有乙個.

2.虛函式表類似乙個陣列,內部放的是指向類的虛函式的函式指標,不是程式**,不肯能儲存在**段.

3.虛函式表儲存虛函式的位址,即虛函式表的元素是指向類成員函式的指標,而類中虛函式的個數在編譯時期可以確定,即虛函式表的大小可以確定,即大小是在編譯時期確定的,不必動態分配記憶體空間儲存虛函式表,所以不再堆中.

根據以上特徵,虛函式表類似於類中靜態成員變數.靜態成員變數也是全域性共享,大小確定.

所以我推測虛函式表和靜態成員變數一樣,存放在全域性資料區.

c/c++程式所占用的記憶體一共分為五種:

棧區,堆區,程式**區,全域性資料區(靜態區),文字常量區.

顯而易見,虛函式表存放在全域性資料區.

另外虛函式表是class specific的,也就是針對乙個類來說的,這裡有點像乙個類裡面的staic成員變數,即它是屬於乙個類所有物件的,不是屬於某乙個物件特有的,是乙個類所有物件共有的

虛函式表是編譯器來選擇實現的,編譯器的種類不同,可能實現方式不一樣,就像前面我們說的vptr在乙個物件的最前面,但是也有其他實現方式,不過目前gcc 和微軟的編譯器都是將vptr放在物件記憶體布局的最前面

C 學習筆記14

include using namespace std template class singleton autorelease public template.args static t getinstance args.args private singleton singleton priva...

C 學習筆記 虛函式

虛函式主要用於c 中的多型特性,對於類的繼承而言,如果用父類的指標指向子類的的物件,當用該指標操作子類物件時,該指標只能操作父類中的函式,而對於子類中特有的和過載的方法,用該指標將無法使用。案例 class base class derive public base void show 派生類獨有的...

C 學習筆記 day14

1 對檔案的分類 1 文字檔案 每個位元組都是有效的可顯示的ascii碼,getline 2 二進位制檔案 位元組是連續的,不能用vi more檢視檔案內容,read按位元組數讀取 write 100 是整數的100,佔4個位元組 100 是字元陣列,佔3個位元組 2 異常 1 人為錯誤 由於程式設...