博覽網 物件導向高階程式設計(上) 第三週課程筆記

2021-08-04 13:43:38 字數 2372 閱讀 7714

第三週主要介紹c++中類與類之間的關係,主要包括復合、委託和繼承這三個基本的關係。在這三個基本關係的基礎上介紹了物件導向的程式開發方法,並且詳細講解了為物件導向程式開發方法提供基本支援的虛函式和多型特性。

一、三種基本關係

1.composition 復合關係

如上述**所示,queue與deque便是乙個基本的復合關係,它表示queue類擁有deque類的物件,二者之間的關係是has-a關係。記憶體上,復合關係的類的物件的大小是其所包含物件的記憶體大小的直接累加。

2.delegation委託關係

如上述**所示,string和stringrep之間便是委託關係。委託關係與復合關係類似,表示的也是has-a。二者的區別在於,委託關係的內部是使用指標來指向所包含的元素的,而復合關係則直接包含該元素。

使用委託關係可以實現類的不同物件使用同一物件來實現其基本功能。

3.inheritance繼承關係

繼承是c++的乙個語言特性,其語法結構如上所示。被繼承的類稱為基類或者父類,繼承的類稱為子類或者派生類。子類會擁有父類的全部屬性和方法,因此二者之間是is-a的關係。

二、虛函式和多型

從**復用的角度來看,繼承關係完全可以通過復合關係來實現,那麼為什麼c++需要實現繼承這樣的語法特性呢?除了語法上更加簡介外,另乙個重要的原因是c++具有虛函式,通過虛函式可以實現符合關係難以實現的許多功能。

c++的類成員函式分為以下幾個類別:

• non-virtual函式:不希望子類重新定義

• virtual函式:希望子類重新定義,且父類有預設定義

• pure virtual函式:子類必須重新定義,父類沒有預設定義

其定義**如下所示:

class shape
其語法特性如下:

• non-virtual函式:子類可以覆蓋該函式,父類指標指向子類物件時,呼叫父類函式

• virtual函式:子類可以覆蓋該函式,父類指標指向子類物件時,呼叫子類函式

• pure virtual函式:子類必須覆蓋該函式,父類指標指向子類物件時,呼叫子類函式

注:從以上特性可知,父類的析構函式必須宣告為虛函式,否則會導致子類析構函式未被呼叫產生記憶體洩漏的問題。

所謂多型是指程式在執行時,由於子類實現的不同,呼叫同乙個函式,有不同的執行效果。比如作為父類shape類,實現了乙個getarea()虛函式,由於其指標所指的物件可能為rectangle,也有可能為circle類,因此其getarea()函式的執行方式必然不同。多型的特性在物件導向程式設計和設計模式中有著廣泛的運用。

三、建構函式和析構函式

建構函式執行順序:

父類建構函式->子類中物件建構函式->子類建構函式

析構函式執行順序:

子類析構函式->子類中物件析構函式->父類析構函式

四、兩個設計模式的例子(內容後面課程會進行更為詳細的講解)

1.compositie模式

2.prototype模式

五、補充:虛函式的底層實現

關於虛函式的實現,在這裡再補充一下。在第二週中的課堂中有提到過物件的記憶體是如何分配的(上週筆記中沒有,因為覺得比較複雜,沒寫上去)。我們知道,物件中只儲存了自己所含有的資料內容,類的方法是存在另乙個地方的,在呼叫方法是通過this指標將物件的資料傳遞到方法中去。因此,在邏輯上,類的資料和方法是放在一起的,但是在底層二者仍然是分開的。

由以上的分析可知,父類的指標並沒有辦法獲取到其所指物件的型別資訊,那麼它又是如何實現多型的呢?答案是通過虛函式表實現。

如圖所示,在有虛函式的物件中,往往會比別的物件多乙個資料項——虛函式表指標,它指向了乙個指標陣列,這個指標陣列中的指標指向了物件中所有存在的虛函式。在呼叫虛函式時,通過該錶便可以找到實際物件所對應的虛函式了。

可見,虛函式本身比非虛函式在呼叫效率上有一定的差距,因此在確定不會被覆蓋的函式上,最好不要使用虛函式。

詳細內容見:

博覽網 物件導向高階程式設計(上) 第一周課程筆記

程式語言學習往往分為兩個部分,一是該語言的語法特性,包括關鍵字 強型別還是弱型別 是否支援指標等等 二是該語言的標準庫,包括提供的基本容器 輸入輸出方法等等。物件導向高階程式設計 上 這門課程主要是介紹第一部分的內容。一 課程基本目標 1.以良好的方式編寫c class,包括以下兩種型別 內部無指標...

博覽網C 學習第三週

本週學習真正的物件導向程式開發,主要就是編寫幾個有關係 is a 的類,然後程式設計的時候針對基類的指標和引用程式設計。其實,c 在這裡 指物件導向程式設計 有一些慣用法 1.基類析構函式必為虛函式 2.基類應該要有虛函式 除了虛析函式外的虛函式 否則設計是有問題的。3.c 中有乙個派別認為虛函式 ...

第三週 PHP物件導向

屬性 方法 變數 也稱為 屬性 函式 也稱為 方法 都是類的成員.markdown 轉義字元 原樣輸出 php類屬性方法的呼叫 把成員方法和成員屬性封裝到類中,隱藏屬性和方法實現的細節 可以使乙個類繼承並擁有另乙個已經存在類的成員屬性和方法,被繼承的類稱為父類或基類,繼承類為子類 子類最多只能繼承乙...