标題取的有點大,自己最近在閱讀C++方面的書籍,這篇部落格其實也就是自己的一些筆記小結。
C++是一種面向對象的程式設計語言,面向對象的三個特性是封裝、繼承、多态。這裡對C++中的繼承進行一些小結梳理。
1 public、private、protected繼承
總的來說,每個類控制它所定義的成員的通路。派生類可以進一步限制但是不能放松對所繼承成員的通路。
(1)public繼承:在子類中,繼承而來的基類成員保持自己的通路級别。基類的public成員為派生類的public成員,基類的protected成員為派生類的protected成員。不過,派生類不能通路基類的private成員。
(2)protected繼承:基類的public成員和protected成員在派生類中是protected成員。
(3)private繼承:基類的所有成員在派生類中均為private成員,但是仍然不能通路基類的private成員。
如果在繼承中不指定是哪一種繼承,編譯器預設為private繼承。
類之間存在三種關系:(a)is-a;(b)has-a;(c)is-implemented-in-terms-of。
public繼承意味着is-a。适用于base class身上的每一件事情一定也适用于derived class身上,因為每一個derived class對象也都是一個base class。
private繼承意味着is-implemented-in-terms-of(根據某物實作出)。如果D以private形式繼承B,意思是D對象根據B對象實作而得。Private繼承通常比複合的級别低。
複合實作的是has-a關系,我們應該盡可能使用複合來實作這種關系,必要時才使用private繼承。
2 接口繼承、實作繼承
(1)接口繼承:public派生類繼承基類的接口,它具有與基類相同的接口。
(2)實作繼承:使用private或protected派生的類不繼承基類的接口。派生類在實作中使用被繼承類,但是,從基類繼承而來的部分并未成為它的接口的一部分。
3 單一繼承、多重繼承、虛拟繼承
(1)單一繼承:派生類隻從一個類派生而來。
(2)多重繼承:派生類從多個基類派生而來。
(3)虛拟繼承:對給定虛基類,無論該類在派生層次中作為虛基類出現多少次,隻繼承一個共享的基類子對象。
對使用虛拟繼承的一些忠告:(考慮到虛拟繼承會增加大小、速度、初始化及指派複雜度成本)
(a)非必要不要使用虛拟繼承。平常應多使用非虛拟繼承。
(b)如果必須使用,盡可能避免在虛基類中放置資料。
多重繼承比單一繼承複雜。多重繼承的一個常用的情形,即将“public繼承自某接口(基類,隻包含純虛函數)”和“private繼承自某實作(即利用private基類來實作派生類的功能)”。簡單地說,就是利用某個類作為輔助,實作從另外一個類繼承過來的接口。