1. 程式人生 > >C++第十三章筆記

C++第十三章筆記

面向物件程式設計的主要目的之一是提供可重用的程式碼,C++類提供了更高層次的重用性,比如類繼承。類有三種繼承方式,公用,私有,保護。這一章只講公有繼承。

派生一個類

使用公有派生,基類的公有成員將成為派生類的公有成員,基類的私有部分也將成為派生類的一部分,但只能通過基類的公有和保護方法訪問。

  • 派生類物件儲存了基類的資料成員(派生類繼承了基類的實現)
  • 派生類物件可以使用基類的方法(派生類繼承了基類的介面)
  • 派生類需要自己的建構函式
  • 派生類可以根據需要新增額外的資料成員和成員函式

建構函式

建構函式必須給新成員和繼承的成員提供資料,但是派生類不能直接訪問基類的私有成員,而必須通過基類方法進行訪問,換句話說,要構造派生類,需要呼叫基類的建構函式。

  • 首先建立基類物件
  • 派生類建構函式應通過成員初始化列表將基類資訊傳遞給基類建構函式
  • 派生類建構函式應初始化派生類新增的資料成員

釋放物件的順序與建立物件的順序相反,即首先執行派生類的解構函式,然後自動呼叫基類的解構函式。

指標

基類指標可以指向派生類物件,但相反卻不可以。基類指標指向派生類物件是向上強制轉換,而派生類指標指向基類物件是向下強制轉換。如果是強制轉換的話倒也可以編譯,但是是有風險的。因為基類的方法派生類都有,但派生類的方法,基類不一定有。這是C++的一個保護手段。

也正是因為基類的指標和引用可以指向派生類,導致了,原來為基類準備的函式,派生類也可以呼叫。很符合程式碼的重用性。

多型公有繼承

如果派生類想改變基類中已經存在的類方法,那麼只需要再重新定義一個就好,但是這樣出現了一個問題,因為基類指標是可以指向派生類的,那麼如果指標或引用呼叫類方法的時候,預設是基類的類方法,儘管兩個方法的實現不同,畢竟是基類指標,哪怕指向的是派生類函式。

為了解決這個問題,可以再基類的方法的宣告前加上virtual,表示是虛方法,那麼,當指標和引用呼叫方法的時候會判斷到底是基類方法還是派生類方法。

如果重新定義基類方法時卻需要呼叫基類方法腫麼辦?為了防止陷入遞迴死迴圈,應該使用作用域解析符。

還要注意,只要派生類重新定義了類方法,基類中的所有類方法都不能用了,包括基類中的函式過載。

因為基類可能使用動態記憶體,派生類也可能使用,因此,最好在基類中使用虛解構函式,保證派生類釋放時正確。不是採用基類解構函式釋放的。

訪問控制:protected

protected和private的區別只有在基類派生的類中 才會表現出來。派生類的成員可以直接訪問基類的保護成員,但不能直接訪問基類的私有成員。因此,對於外部世界來書,保護成員的行為與私有成員相似;但對於派生類來說,保護成員的行為與公有成員相似。

最好對資料成員私有而不是保護,部分方法可以保護。

抽象基類

如果兩個或多個類有共同點,而又有不同點,那麼便可以宣告一個只含有共同點的抽象基類,然後其他各個類都作為這個基類的派生,只新增不同點。

要宣告抽象基類,需要讓它包含純虛擬函式,所謂純虛擬函式,就是虛擬函式的聲明後面加上個=0.

純虛擬函式可以沒有定義,但也可以有定義,他的定義只用在派生類沒有定義的情況。純虛擬函式用來定義派生類的通用介面。

抽象基類不被允許宣告物件,只是作為一個基類使用,只要包含純虛擬函式便被認為是抽象基類。

強制轉換

我也不知道為什麼把強制轉換單獨拿出來總結,感覺挺重要的,或者說挺容易錯的。

因為基類和派生類的關係很微妙,派生類在一定程度上講,對基類的方法挺相容,但是物件友元函式,運算子過載等一些特殊情況,很容易照成二義性甚至是因為型別判斷失誤導致遞迴性的死迴圈,因此善用強制轉換,尤其是在基類和派生類型別模糊的時候。多想想,多寫點,累不死。^


歡迎到微信裡去當吃瓜群眾