繼承是在類之間建立一種相交的關係,使得新定義的派生類的例項可以繼承已有的基類的特徵並且還可以新增新的功能。
繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用已存在的類的功能。
為了提高軟體模組的可復用性和可擴充性,以便提高軟體的開發效率,我們總是希望能夠利用前人或自己以前的開發成果,同時又希望在自己的開發過程中能夠有足夠的靈活性,不拘泥於復用的模組。
繼承是物件導向程式設計的主要特徵之一,它可以讓您重用**,可以節省程式設計的時間。繼承就是在類之間建立一種相交關係,使得新定義的派生類的例項可以繼承已有的基類的特徵和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次。
現實世界中的許多實體之間不是相互孤立的,它們往往具有共同的特徵也存在內在的差別。人們可以採用層次結構來描述這些實體之間的相似之處和不同之處。
在c#中,如果乙個類後面通過冒號又跟了另外乙個類,那麼我們就稱冒號前面的類為子類,冒號後面的類為父類。這種書寫類的方式放映出來的關係就稱為類的繼承關係。
子類:派生類;父類:基類或者超類。
派生類是對基類的擴充套件,派生類可以新增新的成員,但不能移除已經繼承的成員的定義。
繼承是可以傳遞的。如果c從b中派生,b又從a中派生,那麼c不僅繼承了b中宣告的成員,同樣也繼承了a中宣告的成員。
建構函式和析構函式不能被繼承,除此之外其他成員能被繼承。基類中成員的訪問方式只能決定派生類能否訪問它們。
派生類如果定義了與繼承而來的成員同名的新成員,那麼就可以覆蓋已繼承的成員,但這兵不是刪除了這些成員,只是不能再訪問這些成員。
類可以定義虛方法、虛屬性及虛索引指示器,它的派生類能夠過載這些成員,從而使類可以展示出多型性。
派生類只能從乙個類中繼承,可以通過介面來實現多重繼承。
1、如果new乙個子類物件,那麼有如下執行流程:
先定位到子類對應建構函式,沒有繼承的話,執行子類的方法體。
如果有繼承,則轉向了父類的建構函式,執行父類構造方法體。
之後,轉向了子類的方法體繼續執行。
2、如果在子類構造中,沒有使用base或者:base()
顯示呼叫父類的構造,那麼系統也會自動呼叫父類的無參構造。
base代表父類物件,通過:base()
呼叫父類的建構函式,在這裡:
我們就可以理解為繼承,而base()
就是父類的建構函式,()
裡的的引數就是建構函式的引數。
base代表的是方法呼叫,可不需要引數,此時呼叫父類的無參建構函式。
如果要呼叫父類的有參建構函式,base裡需傳入對應的引數。
3、通過base呼叫父類建構函式需要注意以下兩點:
通過base呼叫父類建構函式,只能書寫在子類的構造後。
通過base呼叫父類構造函式引數順序和父類的構造引數一致。
關於base繼承建構函式的知識,請檢視本人另一篇博文:c#中base關鍵字的幾種用法
1、建立類
public
class
person
public
person
(string name,
string ***,
int age)
,性別為,年齡為"
,name,***,age);}
public
void
run(
)public
void
play()
}public
class
teacher
:person
public
teacher
(string name,
string ***,
int age)
:base
(name, ***, age)
,性別為,年齡為"
,name,***,age);}
public
void
teach()
}
注意:teacher的建構函式的引數與base裡的引數要相互對應,其就相當於實參,而原父類的建構函式裡的引數就是形參。在子類例項化時,通過其進行傳參。2、在主方法中進行例項化,並呼叫其方法
teacher th =
newteacher
("張三"
,"男",23
);th.run()
;th.
play()
;th.
teach()
;
3、執行效果
首先還有一種類需要注意,那就是密封類。如果我們對類不作任何約束,也就是說所有類都可以被繼承,這種繼承的濫用會導致類的層次結構十分龐大,類與類之間的關係會變得很亂導致無法理解。因此c#提供了密封類,我們只需在父類前加上sealed修飾符,那這個類將不能被繼承了。密封方法也是在方法前加上sealed修飾符。
抽象類和密封類剛好相反,它是為繼承而生的。抽象類不能例項化,抽象方法沒有具體執行**,必須在非抽象的派生類中重寫。也就是基類並不實現任何執行**,只是進行定義。這一點和介面有相同的地方。
class
program
}public
abstract
class
people
public
abstract
void
eat();
//有時候不想把類宣告為抽象類,但又想實現方法在基類裡不具體實現,
//而是想實現方法由派生類重寫。遇到這種情況時可使用virtual關鍵字將方法宣告為虛方法
public
virtual
void
say()}
class
man:
people
public
override
void
eat(
)public
override
void
say(
)}
深入理解C 之繼承
目錄 繼承 封裝和多型是物件導向程式設計的重要特性。其成員被繼承的類叫基類也稱父類,繼承其成員的類叫派生類也稱子類。派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。派生類只能有乙個直接基類,所以c 並不支援多重繼承,但乙個基類可以有多個直接派生類。繼承是可以傳遞的。即 如果classb派生出...
C 繼承深入理解(一)
繼承 子類繼承父類,子類的物件可以直接訪問父類 公有或保護 成員繼承最大特點提高 重用,也體現 的共性與個性 派生類 繼承父類的子類 基類 被繼承類 父類 繼承語法 派生類 繼承方式 基類 繼承方式 1.private 私有繼承.預設為此繼承方式.不能繼承基類的私有成員.繼承基類公有成員,在派生類中...
C 繼承深入理解(二)
多繼承 乙個派生類繼承多個基類 include include using namespace std class base1 3.隱藏 派生類重新定義基類的方法 1.函式名 引數完全與基類一樣 2.函式名相同 引數不同 這兩種情況都叫隱藏 隱藏與過載區別 1.過載在統一類作用域,隱藏在不同類作用域...