當我們想要設計幾個類分別記錄老師,學生的個人信息時會發現,像姓名、地址、身份證號、電話等等記錄基礎信息的成員變量是都具有的,重復定義會顯得冗余,但同時它們兩者又具有不同的記錄信息的成員變量,像學生需要記錄學號,老師需要記錄職稱,以及不同的成員函數。
可以想個辦法,比如將重復的部分單獨拎出來,都寫在一個類里,然后不同的部分就繼承這個類成為一個類,這樣的新類就叫做子類(派生類)
繼承定義
訪問限定符與繼承方式一起,總共有9種組合方式
繼承方式分為三種
public繼承、protected繼承、private繼承
訪問限定符分為三種
public訪問、protected訪問、private訪問
不可見的意思是,基類的私有成員在派生類里是用不了的
但是有間接的方式,可以借助父類的公有成員函數進行使用
記憶方式:訪問限定符 取 繼承方式和基類的訪問限定符小的那個
如果是class,不寫繼承方式默認就是私有繼承
如果是struct,不寫繼承方式就是默認是公有繼承
繼承類模板
基類是模板需要實例化,按需實例化,不能直接使用,需要指定類域
因為當派生類實例化時,基類也會被實例化,但由于基類是模板類型,所以成員函數并未實例化,所以找不到
派生類可以是模板類或者非模板類
當是模板類時,派生類可以繼承基類模板所以特化版本
當是非模板類時,派生類只能繼承基類模板的某個特定實例,這種情況下,派生類在繼承時需要指定基類模板的參數,實例化一個具體的基類
基類和派生類的轉換
不同類型的對象進行賦值時,會因為類型不同發生類型轉換,過程中會出現臨時對象,所以引用加類型轉換需要加上const(臨時對象具有常性)
在public繼承中,就有個特殊的例外,派生類對象可以直接賦值給基類的指針或者引用,而不需要加const,因為沒有產生臨時對象,給的直接是派生類里父類的那一部分
如果是賦值 父=子的形式,就是通過基類的拷貝構造或賦值重載完成,需要進行切割,將子類的自己定義的部分切掉
隱藏
派生類和基礎類是可以有同名成員的,如果派生類有與基類函數名相同的成員函數(沒有使用virtual關鍵字)或者相同名字的成員變量,基類的同名成員函數或成員變量將會被隱藏
這意味著在派生類對象上調用該函數時,將調用派生類中的版本,而不是基類中的版本。如果需要調用基類中的被隱藏函數,可以使用作用域解析運算符?::
?來顯式指定調用基類中的函數。
派生類的默認成員函數
跟普通類的規則高度相似
分成兩個部分分開處理:
1、基類成員(當成整體,調用基類構造)
2、派生類成員(跟普通類一樣)
在C++中,當創建一個派生類的對象時,為了確保基類的成員被正確初始化,派生類的構造函數必須顯式地調用基類的構造函數。這是因為構造函數不能被繼承,所以派生類需要負責初始化其基類的部分
如果允許構造函數被繼承,可能會導致初始化順序的問題。派生類的構造函數需要在初始化派生類成員之前先初始化基類成員,如果構造函數可以被繼承,那么這種初始化順序將無法保證