在前面的章節,我們學會了如何編寫乙個完整的類。然而,物件導向的優勢還沒有被完全體現出來。特別是在編寫一些相似的類時,可能會造成很多的浪費。本章就將以乙個文字遊戲為例,向大家介紹類的繼承問題。
在乙個角色扮演類遊戲(rpg)中,可能有各種不同職業的玩家,比如劍士、弓箭手和法師。
雖然他們的職業不同,卻有著一些相似之處:他們都具有生命值(health point——hp)、魔法值(magic point——mp)、攻擊力(attack point——ap)、防禦力(defense point——dp)、經驗值(experience——exp)和等級(level——lv)。
雖然他們有著相似之處,但又不完全相同:劍士和弓箭手都具有普通攻擊的技能,只不過劍士用的是劍,而弓箭手用的是弓箭。
這樣看來,我們有麻煩了。如果只用乙個類來描述三種不同職業的玩家,肯定無法描述清楚。畢竟這三種職業不是完全相同的。如果用三個類來描述這三種職業,那麼三者的共同點和內在聯絡就無法體現出來,並且還造成了相同屬性和功能的重複開發。
我們需要有一種好的方法,既能把劍士、弓箭手和法師的特點描述清楚,又能減少重複的開發和冗餘的**。
在c++中,有一種稱為繼承的方法,使我們可以用一種已經編寫好的類來擴寫成乙個新的類。新的類具有原有類的所有屬性和操作,也可以在原有類的基礎上作一些修改和增補。繼承實質上是源於人們對事物的認知過程:從抽象概念到具體事物。下面我們就來看看劍士、弓箭手和法師的邏輯關係:
在上圖中玩家是乙個抽象的概念,劍士、弓箭手和法師是具體的事物。任何乙個玩家都具有生命值、魔法值等屬性,具有發動普通攻擊和特殊攻擊的能力。不同職業的玩家在發動普通攻擊和特殊攻擊時,有著不同的效果。
如果你不太玩遊戲,或者對劍士、弓箭手沒有什麼概念,那麼我們再來看看學生這個例子。學生是乙個抽象的概念,具體的有本科生、中學生、小學生等。任何乙個學生都具有姓名、身高、體重、性別等屬性,具有學習的能力。不同階段的學生在學習時,內容會有所不同。小學生學習四則運算,中學生學習代數幾何,本科生學習高等數學。如下圖:
為了描寫小學生、中學生、本科生,我們可以寫三個不同的類,但是會造成部分屬性和功能的重複開發。我們也可以先設計乙個學生類,描述出各種學生的共同屬性或功能,然後再針對不同種類的學生做細節的修改。顯然,第二種做法更為省力、合理。
如果有乙個類,我們可以將其實例化,成為若干個物件。另外,如果我們希望對這個類加以公升級改造,我們可以將這個類繼承,形成子類(或者稱為派生類),被繼承的類則稱為父類(或者稱為基類)。
例項化和繼承是乙個類的兩種發展方向。繼承能夠減少我們開發程式的工作量,提高類的重用性。
如果我們把編寫乙個類看作是一次生產,那麼產品(即編寫出來的類)可以有兩種用途:一種是將產品直接使用,相當於將類例項化;另一種是將產品用於再生產,相當於將類繼承。類在這種不斷的「再生產」中變得更為強大、健全。
在第15章中,我們曾將鍊錶結點類的例項物件作為鍊錶類的成員資料。這稱為物件的組合,它與類的繼承也是完全不同的概念。
繼承(inheritance)是概念的延續,子類和父類一般都是概念擴充套件的關係,我們通常把這種關係稱為「是」關係。比如:本科生是學生,自行車是交通工具。而物件的組合是因功能需求產生的從屬關係,我們通常把這種關係稱為「有」關係。比如:鍊錶有乙個頭結點,電腦有乙個**處理器等等。
關於如何更合理地設定類以及類與類之間關係的問題,會在軟體工程這門課中作更詳盡的介紹。
原文:
C 類和物件 繼承
當我們在定義類的時候類與類之間可能存在某些共性這些共性是可以通過繼承被傳承給下乙個類的,我們將其稱為繼承,使用其技術可以減少重複的 提高類之間的關係性 語法格式 class 子類 繼承方式 父類 class baseclass class myclas public baseclass 繼承方式一共...
類和物件與繼承
類與物件 1.類 類是客觀存在的,抽象的,概念的東西。public class dog void hungry 1.public 是類的修飾符,表明該類是公共類,可以被其他類訪問。2.class 是定義類的關鍵字。3.dog是類的名稱。4.name,age是類的變數,也叫屬性 bark hungry...
C 物件導向 7 類的繼承和組合
1 定義類的時候不指定父類,則父類是object類。object類是任何類的直接或者間接父類。所有類都是object的子類。2 例1 class person public int age public class chinese person public void kongfu chinese ...