C 關於指標,繼承和多型介紹

2022-09-20 17:18:10 字數 1437 閱讀 6076

目錄

首先,指標不僅僅是乙個位址,還存在乙個和所指向內容大小相關的值,如下**:

#include

using namespace std;

int main()

從執行結果可以看出pa+1,位址增加了4個位元組;pb+1,位址增加了2個位元組;ppa+1,位址增加了2個位元組;而使用void指標指向整型變數a,此時ppa+1,位址只增加了1個自己。從這個結果我們可以很明顯看出,指標不僅僅是乙個存位址的變數,還存在乙個和記憶體分配相關的值。其實進一步說,指標不僅僅是乙個位址值,還存放著如何解釋記憶體的規則。(void指標只存放位址,沒有解釋規則)

眾所周知,繼承可以實現用父類的指標來指向子類的物件,為什麼可以這樣用呢?正如上面所說,指標儲存位址和解釋記憶體的規則,當你宣告乙個父類指標,那麼你就指明了該指標的解釋規則,當你將子類位址傳給指標時,你就相當於給了一塊記憶體給這個指標,然後這個指標就可以用它的規則去解釋這塊記憶體。根據上面的說法,那麼我們可以得出,子類物件中必定存在一塊記憶體,其分配方式和父類物件一模一樣(如果把這塊記憶體單獨提取出來,它就是乙個父類物件),事實也是如此,而且這塊「父類物件」一般都是存放在子類物件的最前面,這就解釋了子類在構造的時候,一定會先呼叫父類建構函式。同時,「父類物件」指標只能訪問自己的父類成員。那麼考慮多繼承的情況,多繼承的子類,其記憶體空間中必定存在多個「父類物件」空間,這些父類空間的位址必定是不同的,那麼就會造成同乙個多繼承的子類,用其不同的父類指標指向它,其位址值是不同的,實際測試的確如此:

#include

using namespace std;

class a

;class b

;class c : public a, public b

;int main()

其記憶體布局如圖,pa、pb都指向各自的「父類物件」空間起始位置,pa只能訪問a、aa,pb只能訪問b(至於為什麼a是int卻佔8個位元組,這個和記憶體對齊有關,自行查詢)。

c++的繼承和多型繞不過的乙個東西便是虛指標和虛函式,這裡簡單說一下:首先,在含有虛函式的類中,會產生乙個虛函式表,注意這個虛函式表是從屬於類的,不是從屬於物件,也就是多個物件共享這個虛函式表。其次,每個類宣告的物件都會有乙個虛指標,這個虛指標指向類的虛函式表。(這裡只是簡單提及一下,更多的東西可以自行查詢)看過很多網上的東西,都說虛指標是每個物件的第乙個資料成員,也就是分配在最開頭的位址空間。其實,我覺得這句話不完全正確,因為當多繼承中有虛函式時,虛函式表就有多個,虛指標也有多個,這些虛指標不一定全都存在於最開始的位址空間。應該說,這些虛指標存在於繼承的父類所管理區域的開頭:

#include

using namespace std;

class a

};class b

};class c : public a, public b

};int main()

從上面的結果可以看出,虛指標不一定都是存在最開始的位置,如果硬要說是開始,應該也是相對於「父類物件」區域的開始。

C 繼承和多型

在c 的物件導向的大家庭裡,我感覺繼承算是很重要的了,因為有很多的東西都是依賴於繼承和多型的,所以單獨的在第三篇部落格裡做總結和昇華。繼承在面相物件的地方是乙個很是重要的東西,可以說在物件導向的世界裡沒有了繼承就沒有了這麼多的東西,而沒有了多型就沒有了多彩的世界。類的繼承是最為普遍的事情了,可是類又...

C 繼承和多型

剛學習了c 繼承和多型,對virtual override seal override new有點了解,在此寫下這篇文章以供以後參考,若有錯誤或不足,還望各位指出。這裡有3個類,分別是grandfather father son。好,我們現在來分析一下grandfather的遺產怎麼讓father繼...

C 繼承和多型

繼承是使 復用的一種機制。本質 單繼承 乙個派生類乙個基類派生。多繼承 乙個派生類有兩個人或者多個基類。如 馬與驢雜交所生的騾子就有兩個基類,騾子既繼承了馬的一些特徵,也繼承了驢的一些特徵 構造派生類包括 1 從基類接收成員 派生類接收基類的全部成員,沒有選擇 2 調整從基類接收的成員 可以改變基類...