目錄
繼承、封裝和多型是物件導向程式設計的重要特性。
其成員被繼承的類叫基類也稱父類,繼承其成員的類叫派生類也稱子類。
派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。派生類只能有乙個直接基類,所以c#並不支援多重繼承,但乙個基類可以有多個直接派生類。
繼承是可以傳遞的。
即:如果classb派生出classc,classa派生出classb,則classc會繼承classb和classa中宣告的成員。
class a
",sum);}}
class b : a
", minus);
this.sum(3, 4);}}
class inheritancetest1
}結果:
i am b ,my minus=-1
i am a ,my sum = 7
試想一下,當基類sum()方法是私有時,派生類還會繼承該方法嗎?
經過本人測試,沒有在b類找到該方法,那麼是不是它就沒有被繼承呢?其實不是的,私有成員其實已經被繼承了,但是它們卻不可以被訪問,因為私有成員只能被宣告它們的類或結構體中才可訪問,所以看上去像是沒有被繼承。
如果我們想降低訪問基本,我們可以把基類sum()方法定義為protected。
答案是可以的,c#提供了乙個sealed 修飾符,此修飾符會阻止其他類從該類繼承。
sealed class a
",sum);}}
class b : a
", minus);
this.sum(3,程式設計客棧 4); //編譯器會報錯 }}
前面說過,派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。
我們知道基類的初始化工www.cppcns.com作由基類的建構函式完成,派生類的初始化工作則有派生類的建構函式完成,但是這樣就產生了派生類建構函式的執行順序問題。
當基類沒有建構函式,派生類也沒有建構函式時,派生類新曾成員的初始化工作由其他公有函式來完成。
public class a
" ,test);}}
class b : a
", i);}}
class inheritancetest1
}結果:i am i=3
如果只有派生類定義建構函式時,只需構造派生類物件即可。物件的基類部分使用預設建構函式來自動建立。當基類和派生類
如果基類中是沒有引數的建構函式,那麼他可以隱式的被派生類www.cppcns.com執行,也就是說,派生類根本不需要包含建構函式如果基類中是沒有引數的建構函式,在派生類中可以自定義有引數的建構函式publicclassa
public class a
", test);}}
class b : a
class inheritancetest1
}結果:
i am a 公有預設建構函式 ,test=5
由此可ctpfcb以看見,基類的建構函式被執行,在派生類中被呼叫。
如果基類定義了帶有引數的建構函式,那麼此建構函式必須被執行,且在派生類中實現該建構函式,此時我們可以使用base關鍵字
class a
", test);}}
class b : a
",j);}}
class inheritancetest1
}結果:
i am a 公有有參建構函式 ,test=1
i am b 公有有參建構函式,j=1
由此可見: 派生類隱式執行基類中帶有引數的建構函式,在程式中基類定義了帶有引數的建構函式,在其派生類中被繼承,並使用base關鍵字呼叫基類中的建構函式來傳送引數。
我們可以從**中看到在建立派生類的物件後,程式首先執行的是基類的建構函式中的內容,然後才是派生類中的內容。
如果派生類的基類也是派生類,則每個派生類只需負責其直接基類的構造,不負責間接基類的構造,並且其執行建構函式的順序是從最上面的基類開始的,直到最後乙個派生類結束。
本篇文章就到這裡了,希望可以幫助到你,也希望您能夠多多****的更對內容!
本文標題: 深入理解c#之繼承
本文位址:
深入理解C 物件導向之繼承
繼承是在類之間建立一種相交的關係,使得新定義的派生類的例項可以繼承已有的基類的特徵並且還可以新增新的功能。繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用已存在的類的功能。為了提高軟體模組的可復用性和可擴充性,以便提高軟體的開發效率,我們總是希望能夠利...
C 繼承深入理解(一)
繼承 子類繼承父類,子類的物件可以直接訪問父類 公有或保護 成員繼承最大特點提高 重用,也體現 的共性與個性 派生類 繼承父類的子類 基類 被繼承類 父類 繼承語法 派生類 繼承方式 基類 繼承方式 1.private 私有繼承.預設為此繼承方式.不能繼承基類的私有成員.繼承基類公有成員,在派生類中...
C 繼承深入理解(二)
多繼承 乙個派生類繼承多個基類 include include using namespace std class base1 3.隱藏 派生類重新定義基類的方法 1.函式名 引數完全與基類一樣 2.函式名相同 引數不同 這兩種情況都叫隱藏 隱藏與過載區別 1.過載在統一類作用域,隱藏在不同類作用域...