面向對象及繼承基礎篇

什麼是面向過程?

面向過程如C語言,就是把要實現的功能分成很多模塊,就是函數,每個函數就是一個功能,可能被多次調用。面向過程以過程爲中心的編程思想,分析解決問題的步驟,然後用函數把步驟一步步實現。

什麼是面向對象?

JAVA是純面向對象,C++既可以面向對象也可以面向過程

把要實現的功能打包封裝成一個類,類裏面有他的屬性和函數方法,用類定義對象,比面向過程更加抽象,將問題結構化處理,更抽象。比如人是一個類,我就是類中的一個實例,是個對象,人這個類中有屬性,比如高矮,胖瘦,男女等,同樣人也有行爲,比如吃飯走路,上班,談戀愛

注意:面向對象和麪向過程不是對立的,是各有用途,互爲補充

面向對象的特點封裝,繼承,多態
封裝 面向接口的編程

隱藏對象的屬性和實現細節,僅對外公開接口,C++就是把客觀事物封裝成抽象的類,並且這個類只讓可信的類或對象訪問自己的數據和方法,對其他類 隱藏細節,使代碼模塊化

類的訪問修飾符:

  1. public:所有人都可以訪問
  2. protected:只有本類和本類的子類類中的成員函數可以訪問
  3. private:只有本類成員函數可以訪問
繼承的概念

代碼重用,讓子類擁有父類的屬性和方法,也可以定義子類自己特有的屬性或方法或重新定義父類的方法,(子類擁有父類的函數跟成員變量,並且有自己的屬性(成員變量)和方法(函數))

子類繼承了父類所有的數據成員和除構造函數和析構函數之外的函數成員,注意:構造函數和析構函數不能被繼承,但是在子類初始化的時候還是被調用,先調用父類的構造函數再調用子類的構造函數

(構造函數和析構函數的功能決定了不能被繼承,因爲他們位於對象創建和銷燬的時候,構造函數時用來產生對象的,在對象之前,而對子類來說繼承是對象調用父類的函數,如果對象都不存在則就沒辦法調用了)

繼承的權限

無論哪種權限,父類中private的成員都對子類不可見,不可直接訪問 (未指定的情況下編輯器會默認繼承方式爲protected或private)

  1. 公有繼承:父類的public和protected成員在子類中仍是public和protected成員,表示訪問屬性不改變(子類內成員可以直接訪問,類外只能通過子類的對象訪問)

  2. 保護繼承:父類的public和protected成員在子類中都變成protected權限,訪問屬性全部改成保護

  3. 私有繼承:父類的public和protected成員在子類都變成private權限,訪問屬性全部變成私有

  4. 使用using聲明可以改變父類成員在子類的訪問屬性,改爲private或protected

using book::setprice;book是父類,這條語句寫在子類private裏面
setprice是父類的public成員函數,這樣聲明後public屬性轉爲private屬性
繼承的一些知識點
  1. 如果子類定義了跟父類同名的成員變量或者函數,那麼新增的這個變量或者函數就會遮蔽掉父類繼承來的,如果要調用父類的,就要用類名::函數名
  2. 繼承可以直接繼承也可以間接繼承,比如A繼承B,C繼承A,那麼C也繼承B
  3. 子類中沒有新增的成員變量,子類就不需要新增構造函數,創建子類對象時直接調用父類的構造函數
  4. 當子類有構造函數時,初始化順序還是先調用父類的構造函數進行初始化,再調用子類的構造函數, 構造函數的調用順序是按照繼承的層次,自頂向下,從父類到子類
  5. 繼承會破壞包裝,父類實現細節暴露給子類,而且繼承是一種類與類之間的強耦合的關係,當兩個類的關係是is–a,可以考慮用繼承,但繼承並不是越多越好
  6. 子類的構造函數可以自己調用父類默認的構造函數,前提是默認構造函數存在,但是如果我們定義了帶參的構造函數,系統就不會自動生成默認構造函數,子類就沒辦法調用,解決辦法我們在定義類的時候都定義一個默認構造函數,第二就是子類的每一個構造函數都顯示的調用基類的構造函數
codebook()::book(){z=0};
codebook(int a)::book(a,b){z = c};//顯示調用,用::符號後面跟父類的構造函數
虛繼承解決菱形繼承
  1. 一個子類可以有多個父類就是多繼承,多繼承要注意命名衝突的問題
  2. 菱形繼承,會產生命名衝突,因爲最後菱形底部的那個類會繼承來自頂部類的兩份成員變量和成員函數,產生衝突,C++提供了虛繼承解決這個問題
  3. 虛繼承只需在繼承屬性前面加上virtual關鍵字就可以
  4. 虛繼承的目的是讓某個類作出聲明,承諾願意共享他的父類,共享的父類子對象成爲虛基類,這樣不管虛基類繼承了多少次,在派生類中都只包含唯一一個共享的虛基類子對象
  5. 虛基類中構造函數的順序,首先構造虛基類本身爸爸類,然後是兒子1類,然後兒子2類,最後是孫子類,如果有非虛基類的話,放到虛基類後面,比如如果增加一個媽媽類,就放到兒子2的後面,孫子的前面
class Dad{}
class Son1 : virtual public Dad{}
class Son2 : virtual public Dad{}
class Grandson : public Son1, public Son2, public Mom{}

以上就是一個簡單的虛基類,virtual說明了一種願望,即在後續的子類中共享虛基類的一份實例.
上述例子中孫子通過兒子1和兒子2繼承了爸爸,因爲兒子1和兒子2都是虛繼承,所以孫子裏面只有一個爸爸基類的部分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章