關於繼承的問題

2022-07-26 08:12:13 字數 2148 閱讀 5506

——摘自rocky ren

派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。

派生類只能有乙個直接基類,所以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);       //編譯器會報錯     }}

前面說過,派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。

那麼我們該如何獲得基類的建構函式和自身的建構函式呢?

我們知道基類的初始化工作由基類的建構函式完成,派生類的初始化工作則有派生類的建構函式完成,

但是這樣就產生了派生類建構函式的執行順序問題。

當基類沒有建構函式,派生類也沒有建構函式時,派生類新曾成員的初始化工作由其他公有函式來完成。

public  class a

" ,test);}}

class b : a 

", i);}}

class inheritancetest1 

}結果:i am i=3

如果只有派生類定義建構函式時,只需構造派生類物件即可。物件的基類部分使用預設建構函式來自動建立。

當基類和派生類都定義有建構函式時,那麼執行順序會怎樣呢?

如果基類中是沒有引數的建構函式,那麼他可以隱式的被派生類執行,也就是說,派生類根本不需要包含建構函式

如果基類中是沒有引數的建構函式,在派生類中可以自定義有引數的建構函式

public  class a

", test);}}

class b : a 

class inheritancetest1 

}結果:i am a 

公有預設建構函式

,test=5

由此可以看見,基類的建構函式被執行,在派生類中被呼叫。

如果基類定義了帶有引數的建構函式,那麼此建構函式必須被執行,且在派生類中實現該建構函式,此時我們可以使用base

關鍵字class a

", test);}}

class b : a 

",j);}}

class inheritancetest1 

}結果:i am a 

公有有參建構函式 ,

test=1     

i am b 公有有參建構函式,

j=1由此可見: 派生類隱式執行基類中帶有引數的建構函式,在程式中基類定義了帶有引數的建構函式,

在其派生類中被繼承,並使用base關鍵字呼叫基類中的建構函式來傳送引數。

我們可以從**中看到在建立派生類的物件後,程式首先執行的是基類的建構函式中的內容,然後才是派生類中的內容。

如果派生類的基類也是派生類,則每個派生類只需負責其直接基類的構造,不負責間接基類的構造,

並且其執行建構函式的順序是從最上面的基類開始的,直到最後乙個派生類結束。

關於繼承的問題

繼承,我這裡只說方法,繼承關心的是我從父類繼承來的東西有不是擁有的東西 簡單地說也就是能使用的東西 1。訪問修飾符為private的方法不能被繼承,而是被隱藏,在子類中可以寫乙個跟父類訪問修飾符為private方法一樣的方法,這裡不存在覆蓋問題,因為方法被隱藏,根本就沒有被繼承,所以不存在覆蓋問題,...

關於原型的繼承問題

原型作用 資料共享,目的 為了節省記憶體空間,原型作用 繼承 目的是 為了節省記憶體空間原型繼承 改變原型的指向 借用建構函式繼承 主要解決屬性的問題 組合繼承 原型繼承 借用建構函式繼承function person name,age,weight person.prototype.sayhi f...

關於static的繼承問題

今天研究了一下被static修飾的變數和方法,在子類中繼承的問題,網上也看了別人的部落格,自己也動手試了一下 如下 1 父類 2package com.xujingyang.test 34 public class father 11public void nostaticmethod 14 151...