C 第二大特性 繼承

2021-08-28 05:56:09 字數 2639 閱讀 3173

繼承(inheritance)機制是物件導向程式設計使**可以復用的最重要的手段,它允許程式設計師在保持原有類特 性的基礎上進行擴充套件,增加功能。這樣產生新的類,稱派生類。繼承呈現了物件導向程式設計的層次結構, 體現了由簡單到複雜的認知過程。

簡單地說,繼承就是對**的復用。

繼承的方式共有public、protected、private三種方式,不同的繼承方式會導致子類的父類的訪問屬性不同。如下表:

類成員/繼承方式

public繼承

protected繼承

private繼承

基類的public成 員

派生類的public成員

派生類的protected成員

派生類的private成員

基類的 protected成員

派生類的protected成員

派生類的protected成員

派生類的private成員

基類的private成員

不可見,只能通過基類介面訪問

不可見,只能通過基類介面訪問

不可見,只能通過基類介面訪問

總結:可以將這個表總結為兩點來記憶。

class

plant

;class

tree:public plant //tree這個類繼承plant這個類

;

這種模型的特點就是:tree這個類繼承了plant類後,不但有自己的一些獨特的屬性或功能(plant這個類沒有的屬性或功能),而且擁有和plant相同的屬性或功能。這種關係就屬於is-a關係,也就是說「樹」是一種植物,但"植物"不是「樹「。當我們要設計的時候,遇到乙個具有類似這種關係的模型,就可以用is-a關係。

class

tire

;class

car:public tire

;

has-a關係模型的特點就是:父類的子類一部分,這樣我們就可以在子類中定義基類的物件來構成完整子類應該具有的屬性或功能;例如,我們在子類」汽車「中的成員變數定義基類「輪胎「的物件,這樣做就可以將汽車這個實體包裝完整,因為輪胎就是汽車的乙個部件,汽車是由許許多多個部件構成。以後我們設計的時候就可以分析具體的例項來選擇是否用它。

注意:當我們分析具體例項時,以上兩種關係都存在時,那麼有限使用的是 has-a關係,因為總軟體工程的角度來講,has-a的耦合度更低。

class person

protected:

string _name;

// 姓名};

class student : public person

;void

test()

因為我們要在類外面通過test函式來完成一些賦值的操作,所以這裡採用public繼承;

我們將上面的5個問題逐個分析;

p = s; 子類物件可以賦值給父類物件,這就是我們所謂的切割/切片。相當於將子類中和父類相同的部分賦值過去。

//s = p; 父類物件不能賦值給子類物件 。因為父類是子類的一部分,子類多出的那一部分無法賦值。

person* p1 = &s; person& r1 = s; 父類的指標/引用可以指向子類物件 。原因很簡單,父類指標指向子類,訪問時也就只能訪問到子類的一部分成員,很合理。引用底層其實也是指標,所以他們兩都可以。

student* p2 = (student*)&p; student& r2 = (student&)p;子類的指標/引用不能指向父類物件(可以通過強制型別轉換完成),子類指標指向父類,在訪問時很明顯會越界訪問,但是vs編譯器可以通過強轉來實現,這裡要注意,雖然這樣編譯可以通過,但是是存在隱患的。第五點就可以說明。

p2->_num = 10; r2._num = 20; 這裡會發生什麼? 當通過強轉將父類指標轉換為子類指標時,執行第五點的兩行**在編譯時也不會報錯,但是執行時就會崩潰掉,因為越界訪問;但非要訪問的話,也是有辦法的,這裡就要涉及到另外乙個知識點——rtti(dynamic_cast),我們可以借用它來完成強轉,並且在讓程式不會崩潰的前提下。這會在我的下個部落格中會詳細說明。

rtti — dynamic_cast操作符

繼承體系下,派生類中沒有顯示定義這六個預設成員函式,編譯器會合成(區別於生成)這六個預設成員函式。

生成:不依賴於任何東西,只是編譯器根據類的定義簡單生成基於基礎型別的預設成員函式。

合成:必須依賴於基類,編譯器根據基類的相應成員函式的行為來合成派生類的預設成員函式。

注意:

面試題:實現乙個不能被繼承的類:將基類的建構函式宣告為private.

友元關係不能繼承,也就是說基類友元不能訪問子類私有成員和保護成員。

基類定義了static靜態成員,則整個繼承體系裡面只有乙個這樣的成員。無論派生出多少個子類,都只有乙個static 成員例項 。

第二大整數

問題描述 編寫乙個程式,讀入一組整數 不超過 20個 當使用者輸入 0時,表示輸入結束。然後程式將從這組整數中,把第二大的那個整數找出來,並把它列印出來。說明 1 0表示輸入結束,它本身並不計入這組整數中。2 在這組整數中,既有正數,也可能有負數。3 這組整數的個數不少於2個。輸入格式 輸入只有一行...

C語言 第二大整數

演算法提高 第二大整數 時間限制 1.0s 記憶體限制 512.0mb 問題描述 編寫乙個程式,讀入一組整數 不超過20個 當使用者輸入0時,表示輸入結束。然後程式將從這組整數中,把第二大的那個整數找出來,並把它列印出來。說明 1 0表示輸入結束,它本身並不計入這組整數中。2 在這組整數中,既有正數...

第二大的數

這是微軟的一道面試題,是我找工作時看的面試寶典裡面的一題,覺得很有意思,這種處理的方法應該可以用在很多地方。下面就來進入正題吧。題目 寫乙個函式,找出乙個整數陣列中,第二大的數。時間複雜度o n const int minnumber 32767 int ctestsizeofdlg find se...