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

C++第十四章筆記

第十四章講的是C++中的程式碼重用,程式碼重用是C++的主要目標之一,因此,通過多種繼承、模板來實現。

包含

公有繼承是is-a關係,也就是說is a type of,可認為是並列關係。但兩個類之間不光有並列關係,還是包含關係:has-a關係。那麼就又有了包含,私有繼承,保護繼承。

包含很簡單,就是在類的宣告中新增一個類的物件作為資料成員。

私有繼承

私有繼承基類的公有成員和保護成員都將成為派生類的私有成員。這將意味著基類方法將不會成為派生物件的公有介面的一部分,但可以在派生類的成員函式中使用它。

訪問基類

通過初始化列表直接呼叫基類解構函式初始化基類物件,而對於訪問基類物件則可以使用強制轉換。當然,訪問基類物件是在他的可見作用域,派生類的內部實現的。

保護繼承

保護繼承,基類的公有成員和保護成員都將成為派生類的保護成員。和私有繼承一樣,基類的介面在派生類中也是可用的,但在繼承層次結構之外是不可用的。當派生類派生出另一個類時,私有繼承和保護繼承之間的主要區別便呈現出來了。使用私有繼承時,第三代類將不能使用基類的介面,這是因為基類的公有方法在派生類中將變為私有方法;使用保護繼承時,基類的公有方法在第二代中將變成裱糊的,因此第三代派生類可以使用他們。

using重新定義訪問許可權

對於保護的方法,可以使用using來在public重新定義對外訪問許可權,定義方法比如:

using std::valarray::min;

來開放min函式的對外許可權。

多重繼承

多重繼承可以讓一個類從多個基類繼承。

如果多個基類有共同祖先,那麼新繼承的類中可能有多個相同部分(共同祖先),當然,他們並存而且可以分別訪問(通過,對基類的作用域解析運算子),但是大多數情況是不需要的,因此,可以在繼承的時候新增virtual,使用虛基類,那麼,對於多個虛基類的共同祖先,只會產生一個。

如果是虛基類,在建構函式就不應該用初始化列表呼叫基類,而應該呼叫基類的祖先。在虛基類中,這是必須的,但是非虛基類,這是非法的。

因為多重繼承經常產生二義性的問題,因此,善用作用域解析運算子。

類模板

C++的類模板為生成通用的類宣告提供了一種更好的方法。模板提供引數化型別,既能夠將型別名作為引數傳遞給接收方來建立類或函式。

使用方法,在類的宣告和函式的定義(如果是類外定義的話)前加上:

template

類模板可以做基類,可以用作元件類,可以做其他模板的型別引數,可以遞迴巢狀使用。

模板的具體化

和函式模板一樣,可以隱式例項化,顯式例項化,顯式具體化。甚至可以部分具體化(只支出幾個而不是全部引數)。

成員模板

類模板可以作為類的成員或者模板類的成員但在template語句是注意巢狀關係

模板用作引數

模板包含型別引數和非型別引數。模板還可以包含本身就是模板的引數,這種引數是模板新增的特性,用於實現STL。

模板和友元

模板類宣告也可以有友元,模板的友元分3類:

  1. 非模板友元,即和模板無關的友元
  2. 約束模板友元,即友元的型別取決於類被例項化的型別
  3. 非約束模板友元,即友元的所有具體化都是類的一個具體化的友元

C++11別名

之前的別名都是通過typedef實現,C++11允許使用using,比如:

using LL = long long;

和typedef相比,不僅可讀性更強,而且對於模板的重新命名更方便,比如:

template
using arrtype = std::array;

所有的這些機制的目的都是為了讓程式設計師能夠重用經過測試的程式碼,而不用手工複製他們,這樣可以簡化程式設計工作,提高程式可靠性!


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