對C 繼承的理解

2021-10-05 05:15:26 字數 1562 閱讀 7792

繼承是一種**復用的方式,使得我們不必寫重複的**。

例如,有三種怪物a、b、c,他們都有速度、血量、攻擊力、防禦值、攻擊方式。如果沒有繼承我們可能要寫三個指令碼monstera、monsterb、monsterc,而且在某個指令碼中我們還要重複的宣告定義變數speed等。如果這有三種怪物,那麼貼上複製起來很快;如果有三十種怪物呢?那麼貼上複製起來就很煩。繼承可以為我們解決這個問題。

這時我們要多寫乙個指令碼basemonster,讓三種怪物的指令碼都繼承basemonster指令碼。那麼三種怪物指令碼繼承什麼呢?當然是繼承他們共有的東西,例如速度、血量、攻擊力、防禦值等變數、攻擊方式等方法。

這意味著子類可以訪問父類的變數,那麼父類變數的訪問修飾符就應該為public。如果只有子類可以訪問父類的變數,而其他類不能訪問父類的變數呢?這就是訪問修飾符protected的作用。如果父類有不希望其他類和子類訪問(獲取)的變數呢?這要用private修飾符。

同樣的,對於父類中的方法也會存在這麼三種情況:①子類和其他類都可以訪問(使用),用public修飾方法②子類可以訪問、其他類不可以訪問,用protected③子類和其他類都不可以使用,用private。

對於怪物a,又可以分為boss和小怪,同樣的,我們可以讓boss指令碼和小怪指令碼繼承怪物a的指令碼monstera。那麼這樣的話boss指令碼和小怪指令碼也會繼承basemonster指令碼。如果basemonster中的某個方法可讓monstera繼承,但不能讓boss指令碼繼承,那麼可以在monstera中sealed修飾符密封方法。同樣的,如果我們不希望boss指令碼再被繼承,可以用sealed密封類。

那麼對於某乙個可以被繼承的方法,例如攻擊方法,怪物a、b、c的攻擊方法都有所不同,不是直接用繼承自basemonster的方法,我們要重新寫這個方法,即方法重寫。這個在基類中能被重寫的方法就是虛方法。

為了讓編譯器區分虛方法、密封方法、公開方法、私有方法、可繼承方法,就需要用一些特定的修飾符去修飾(標明)這個方法。在父類中標明虛方法的修飾符是virtual,在子類中標明這個方法需要被重寫的修飾符是override,而且父類中的虛方法的方法名和子類中重寫方法的方法名要一樣,這樣編譯器才會根據virtual知道在父類中這個方法m可以被重寫,在子類中根據override知道有個方法已被重寫,並根據方法名知道要重寫父類中的方法m(父類中可能有很多方法可以被重寫)。

我們既然重寫了這個方法m,那麼顯然是需要執行我們重寫的方法,所以在呼叫這個方法的時候就要執行重寫方法,也就是說重寫方法會優先於虛方法執行。對於basemonster中的攻擊虛方法,我們在monstera、monsterb、monsterc中重寫了攻擊方法,所以我們在呼叫basemonster中的攻擊虛方法時,會自動執行對應的重寫方法,而不用我們去寫if else來判斷這個怪物是怪物a、還是怪物b、還是怪物c,再執行這個怪物的攻擊方法。這就實現了多型。一句**實現了多種狀態。

那麼我們怎麼知道什麼時候用單獨的類、什麼時候用繼承呢?

這需要我們做需求分析,把要實現的東西寫成文件,如果發現有很多需要重複的資料和方法,那麼顯然就要用繼承。如果不開始寫文件就抓著點思路直接寫**,那麼隨著實現的功能越來越多,需要修改的東西就越來越多,會很麻煩,尤其是對大點的專案而言。所以,如果專案複雜點,那麼最好還是也要寫文件分析。

未完待續。。。。

對C 繼承的理解

繼承是可用傳遞的 子類是對父類的擴充套件 必須繼承父類的方法,同時在子類中新增新方法。子類可用呼叫父類的公用方法和字段 而父類不能呼叫子類的成員。子類不僅繼承了父類的共有成員 同時也繼承了父類的私有成員 只是在子類中不能被訪問。繼承的三個關鍵字 abstract 抽象。用來限定類時,類中的方法不能有...

對繼承的理解。

我的發帖。我的體會 0 在做前端的時候發現乙個繼承的適合場景,就是母模板和子頁面的關係。用繼承比組合恰當。1 繼承的根本目的是為了對要解決的問題進行更好的建模 2 繼承的目的不是復用,從某種意義上來說,恰恰是為了處理不能復用的場景。所以才有繼承。復用只是大多數優秀模型的乙個必然結果而已。3 從底層實...

對繼承對映的理解

繼承關係的對映策略有三種 每個繼承結構一張表 table per class hierarchy 不管多少個子類都用一張表。每個子類一張表 table per subclass 公共資訊放一張表,特有資訊放單獨的表。每個具體類一張表 table per concrete class 有多少個子類就有...