類的繼承與派生 virtual override

2021-09-29 05:24:38 字數 1594 閱讀 8642

c#中類的繼承與派生在性質上類似c++,但在有些方面有一些區別。

除了特殊的類object,所有的類都是派生類,即使他們沒有基類規格說明,類object是唯一的非派生類,因為他是繼承層次結構的基礎,與c++不同(c++中允許多繼承),在c#中乙個類宣告的基類規格說明中只能有乙個單獨的類,也就是只允許單繼承,雖然類只能直接繼承乙個基類,但繼承的層次沒有限制。在寫法上也與c++不同,c#中不存在公有繼承、私有繼承等這些繼承方式,所以在寫的時候冒號後面直接接上基類的名字即可,例如 class a : b

雖然子類不能刪除它繼承的任何成員,但可以用與父類成員名稱相同的成員來遮蔽(mask)父類成員,這是繼承的主要功能之一。

遮蔽的使用:

(1)遮蔽乙個繼承的資料成員,需要宣告乙個新的相同型別的成員,並使用相同名稱

(2)遮蔽乙個繼承的函式成員,需要宣告乙個帶有相同簽名的函式成員,簽名由名稱和引數列表組成,不包括返回型別

(3)要讓編譯器知道你在故意遮蔽繼承的成員,可以使用new修飾符,否則,程式可以成功編譯,但編譯器會警告你隱藏了乙個繼承的成員

(4)也可以遮蔽靜態成員

class a

}class b :a

//不加new會有乙個警告

}

表示式:base.成員

類似c++中的多型的產生,c++中使用子類物件給父類指標賦值,當該父類指標呼叫虛函式時,就會產生多型,同理c#中使用子類物件的棧上引用給父類引用賦值,當父類引用呼叫虛方法時,就會產生多型。

class a

}class b :a

}class program

}

父類中被覆寫的方法用virtual來修飾,子類中覆寫後的方法需要用override來修飾

(1)覆寫和被覆寫的方法必須有相同的可訪問性

(2)不能覆寫static方法或非虛方法

(3)方法、屬性、索引器以及事件,都可以被宣告為virtual和override

當使用物件基類部分的引用呼叫乙個覆寫的方法時,方法的呼叫被沿派生層次上溯執行,取尋找標記為override的方法,如果在更高的派生級別有該方法的其他宣告,但沒有被標記為override,那麼它們不會被呼叫

class a

}class b :a

}class c:b

}class program

}

此時a呼叫foo函式,會根據繼承關係向上尋找override方法,在c中有此方法則會呼叫到c中的foo所以列印出c

class c:b

}class program

}

如果將c中的foo函式使用new來修飾,而不是override,則在呼叫時找不到c中的override修飾的foo函式,則只能呼叫b中被override修飾的foo函式所以輸出為b

類繼承與派生

繼承 1.在已有類的基礎上新增功能。2.新增資料。在派生類中新增指定字元。3.修改類方法的行為。派生 classa class b public a 一 說明 a是乙個公有基類 公有派生 則a.a的公有成員 成為b 的公有成員 b.a的 私有部分成為b 的一部分,但只能通過 a的公有和保護方法訪問。...

類的繼承與派生

類的繼承與派生 一 派生類生成過程 1 吸收基類成員。2 改造基類成員。3 擴充基類成員。在類的派生中,建構函式和析構函式不能被派生。派生類繼承了基類的全部資料成員和除了構造,析構之外的全部函式 成員。二 類的繼承方式有共有繼承 保護繼承 私有繼承三種 1 公有繼承。基類的公有和保護成員的訪問屬性在...

類的繼承與派生

儘管在派生類物件中含有從基類繼承而來的成員,但派生類並不能直接初始化這些成員,必須使用基類的建構函式來初始化它的基類成員。初始化順序 先初始化基類成員,在初始化自己新增成員。派生類可以訪問基類的公有成員和受保護成員。類的作用域分辨符。我們可以將基類的指標或引用繫結到派生類物件上,但反過來不行,不存在...