C 繼承體系中的記憶體分段

2022-03-20 22:13:25 字數 1851 閱讀 7215

———————————————綜述與目錄——————————————

討論這個問題之前我們先明確類的結構,乙個類的大概組成,下面的很多分類名詞都是我個人杜撰,為的就是讓讀者看懂能夠區分,下面分別分類:

目錄

空類不含任何成員變數,也不繼承某個基類。

結構類像c語言中結構體一樣,要麼只包含基本資料型別,要麼是其他構造型別的巢狀,或者兩者兼而有之。

派生類有至少乙個基類。

多型類本身是乙個派生類,且基類中有虛函式。

以上只是大概的分類,細分會在下面的情況裡討論,該文章僅當作為個人使用c++經驗的總結,不作學習參考,因為歸納與分類這個事情,學會了自然通。

———————————————進入正題——————————————

空類:

空類不空,雖然不含任何成員,但必須用乙個佔位符描述,站在邏輯的角度來考慮,因為其存在的合法性,必須在語法上保證正確性,如果構建乙個空類的陣列。試想沒有大小類構成的陣列,又怎麼去偏移位址來尋找下乙個元素呢!

結構類:

其記憶體分布與c語言中的結構體沒有任何區別。

派生類:

派生表現的是一種繼承關係。派生類中一定有父類的共性,也有自己的個性。表現出的是一種繼承與發展的關係。剛從c語言轉到c++時轉不過彎來常常自問為什麼要繼承呢,都寫到乙個類裡不行嗎?後來明白如果沒有繼承便少了一種**重用方式。關於派生類的記憶體對齊方式,我前面的隨筆中有寫:

要討論派生類的記憶體分段,就要從賦值相容說起,這裡先明確定義:賦值相容規則是指,在需要基類物件的任何地方,都可以使用公有派生類的物件來

替代。

賦值相容細化

1 派生類的物件可以賦值給基類物件。

2 派生類的物件可以初始化基類的引用。

3 派生類物件的位址可以賦給指向基類的指標。

派生類轉化成基類是一種型別安全的轉化,物件賦值不必討論。主要是看指標和引用。

#include using

namespace

std;

class

p1 ~p1()

void*printp1()

protected

:

intm_p1;

};class

p2 ~p2()

void*printp2()

protected

:

intm_p2;

};class son:public p1,public

p2 ~son(){}

void*printson()

protected

:

intm_s1;

};int

main()

執行結果:

不同的基類指標指向同乙個派生類物件,其指標的值不同,也就是說不同基類指標在接受派生類物件賦值時,所指向的派生類的「段」是不一樣的。基類引用派生類物件同理。

多型類:

多型類的討論實際上就是虛函式表的繼承與合併問題,情況比較多,放在這篇文章中討論:

C 繼承體系中的記憶體對齊

本篇隨筆討論乙個比較冷門的知識,繼承結構中記憶體對齊的問題,如今記憶體越來越大也越來越便宜,大部分人都已經不再關注記憶體對齊的問題了。但是作為乙個有追求的技術人員,實現功能永遠都是最基本的要求,把 優化到自己想要的樣子才能從中找到真正的愉悅感。這便是我們追求細節的意義。目錄引子 記憶體對齊示例與規則...

C 繼承體系

乙個繼承體系的根數目,深度和扇出數是否合適,要取決於這個體系要模擬的領域和這個領域所需要的特性,繼承體系就好比乙個有向圖。1 根節點 某個類如果沒有基類,既不是任何類的子類,那麼在有向圖中就是根節點。2 類深度 從根節點到該類最長的可能派生路徑中,所有經過類的數目,也就是說繼承的深度,有多少層的繼承...

C 繼承體系中的名稱覆蓋

首先乙個簡單的樣例 int x int f 在上述 中。函式f的區域性變數x掩蓋了全域性變數x。這得從 c 的名字查詢機制 說起,首先。在函式f的區域性作用域中查詢。甚至是語句塊 假設不存在,到上一層的作用域再進行查詢,該命名空間中查詢,最後是全域性作用域。在類的繼承體系中,名字覆蓋問題也是非常困擾...