繼承,資料抽象和動態繫結是物件導向程式設計的核心思想。使用繼承,可以定義相似的型別並對其相似關係進行建模。通過繼承聯絡在一起的類構成一種層次關係,通常在層次關係的根部有乙個基類,其他類則直接或間接地從基類繼承而來,這些繼承得到的類稱為派生類。下面就讓我們一起來**繼承中的一些常見問題。
1.繼承方式
class
base
;class
derive
:public
base
;
上面的例子是public繼承,在派生類裡邊不可以訪問基類中的private成員,在派生類外不可以訪問基類中的protected成員。
如果是protected繼承,在派生類中可以訪問基類中的public和protected成員,不可以訪問private成員。在派生類外不可以訪問基類中的public,protected和private成員。
如果是private繼承,在派生類中基類中的public和protected成員都成了私有的,都不可以訪問。
還有很重要的一點,在類(class)中如果沒有指明繼承方式時,繼承方式預設為私有繼承(private);在結構體(struct)中如果沒有指明繼承方式時,預設為公有繼承(public)。
2.編譯器合成建構函式的幾種情況
(1)當基類中有建構函式,而派生類中沒有時,編譯器會為派生類合成建構函式。
(2)當基類和派生類中都沒有預設的建構函式,派生類中有另外乙個類 的類物件,這個類中有預設的建構函式,則編譯器會為派生類合成建構函式。
(3)帶虛函式的乙個類建立乙個物件時,若這個類沒有顯式定義自己的建構函式,此時編譯器會合成預設的建構函式。
3.public繼承方式下的賦值相容規則
class base
~base()
void show()
int x;
};class derive:public base
~derive()
void show(int)
int y;
};int main()
【規則1】子類可以給父類賦值,但父類不能給子類賦值;(因為在繼承的時候子類繼承父類了父類的資訊,可以在 進行了物件切片後給子類中相應的父類賦值)
【規則2】父類的指標或引用可以指向子類的物件,但子類的指標或引用不能指向父類的物件。(將子類物件的位址賦給父類指標變數後,只能通過該指標訪問子類中的由父類繼承來的隱藏物件,不能訪問子類的新成員。子類的指標或引用如果想要指向父類的物件,可以通過強制型別轉換完成)
4.菱形繼承
class b
;class b1 :public b
;class b2 :public b
;class d :public b1, public b2
;
上面的例子就是菱形繼承的基本模型,b1和b2都繼承自b,而d又同時繼承了b1和b2。如果對d建立出的物件取sizeof(),大家應該都可以猜出它的值為20,可是這裡邊存在乙個問題:要是訪問b中的資料成員data1,data1會出現重複,既可以通過b1也可以通過b2,訪問時需b1::data1或b2::data1進行訪問,這就產生了二義性,我們可以通過虛繼承來解決菱形繼承中的二義性及資料冗餘問題。以下為虛繼承的**:
class b
;class b1 :virtual
public b
;class b2 :virtual
public b
;class d :public b1, public b2
;
現在若再對d建立出的物件取sizeof(),結果恐怕也不是20了吧,正解是24,為什麼會出現不同的結果呢?這就和虛繼承的底層實現原理有關了。虛繼承可以避免二義性問題一般是通過虛基類指標實現,即各物件中只儲存乙份虛基類(虛基類即共同基類)的物件,多繼承時通過虛基類指標引用該公共物件。所以,在b1中有乙個虛基類指標和data2,在b2中有乙個虛基類指標和data3,而b1和b2中的虛基類指標都指向b中的data1,再加上d中的data4,現在不難理解為什麼是24了吧!
5.一些瑣碎的知識點
友元關係不能被繼承。也就是說基類的友元函式不能訪問派生類成員。
靜態成員可以被繼承。基類定義了static成員,則此成員將會被其他派生類繼承。
在繼承體系中,基類和派生類是兩個不同的作用域。
當基類中有帶引數的建構函式時,派生類中一定要定義建構函式。
以上是我在繼承中的一些總結,如有漏掉的東西後續將會補上。
C 中的繼承
一 繼承 什麼是繼承 繼承是允許重用現有類去建立新類的過程。分類的原則是乙個類派生出來的子類具有這個類的所有非私有的屬性。1 繼承c 中的類 c 不支援多重繼承,c 類始終繼承自乙個基類 如果未在宣告中指定乙個基類,則繼承自 system.object 派生類繼承基類的語法如下 using syst...
C 中的繼承
繼承是c 中的三大特性之一。繼承機制是物件導向程式設計使 可以復用的最重要的手段,它允許程式設計師在保持原有類特性的基礎上進行擴充套件,增加功能。這樣產生新的類,叫做派生類。繼承定義的格式 class deriveclassname 派生類名 asecc label 繼承型別 baseclassna...
C 中的繼承
先看一下下面的例子 file1 cbase.h include using namespace std class cbase virtual cbase void 如果乙個類被用來作為基類的時候,最好把析構函式寫成虛函式。這樣做是為了當用 乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被...