C 學習二之多型的實現

2021-07-09 18:49:10 字數 2637 閱讀 2137

多型算是物件導向中比較重要的知識啦,但是這一內容在實際操作中還是有很多要注意的地方的,多型的實現理解起來也不是那麼容易,為了更好地學習,適時的總結一下多型的實現吧。還請小夥伴們多多的指教啊。

首先解釋下什麼叫多型:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,這就是多型性。換句話說,實際上就是同乙個型別的例項呼叫「相同」的方法,產生的結果是不同的。這裡的「相同」打上雙引號是因為這裡的相同的方法僅僅是看上去相同的方法,實際上它們呼叫的方法是不同的。

先來看乙個小例子

public

class animal

}public

class cat : animal

}public

class dog : animal

}class tester}}

輸出如下:

animal eat.

cat eat.

dog eat.

在上面的例子中,通過繼承,使得animal物件陣列中的不同的物件,在呼叫eat()方法時,表現出了不同的行為。

多型的實現看起來很簡單,要完全理解及靈活的運用c#的多型機制,也不是一件容易的事,有很多需要注意的地方。

我們對上邊的例子就行一下小的修改

public

class animal

}public

class cat : animal

}class tester

}執行結果為:

animal eat...

animal eat...

cat eat...

可以看出,當派生類cat的eat()方法使用new修飾時,cat的物件轉換為animal物件後,呼叫的是animal類中的eat()方法。其實可以理解為,使用new關鍵字後,使得cat中的eat()方法和animal中的eat()方法成為毫不相關的兩個方法,只是它們的名字碰巧相同而已。所以, animal類中的eat()方法不管用還是不用virtual修飾,也不管訪問許可權如何,或者是沒有,都不會對cat的eat()方法產生什麼影響(只是因為使用了new關鍵字,如果cat類沒用從animal類繼承eat()方法,編譯器會輸出警告)。

真正的多型使用override來實現的。回過去看前面的例1,在基類animal中將方法eat()用virtual標記為虛擬方法,再在派生類cat和dog中用override對eat()修飾,進行重寫,很簡單就實現了多型。需要注意的是,要對乙個類中乙個方法用override修飾,該類必須從父類中繼承了乙個對應的用virtual修飾的虛擬方法,否則編譯器將報錯。

好像講得差不多了,還有乙個問題,不知道你想沒有。就是多層繼承中又是怎樣實現多型的。比如類a是基類,有乙個虛擬方法method()(virtual修飾),類b繼承自類a,並對method()進行重寫(override修飾),現在類c又繼承自類b,是不是可以繼續對method()進行重寫,並實現多型呢?看下面又改過的的例子。

public

class animal

}public

class dog : animal

}public

class wolfdog : dog

}class tester

}}執行結果為:

animal eat...

dog eat...

wolfdog eat...

在上面的例子中類dog繼承自類animal,對方法eat()進行了重寫,類wolfdog又繼承自dog,再一次對eat()方法進行了重寫,並很好地實現了多型。不管繼承了多少層,都可以在子類中對父類中已經重寫的方法繼續進行重寫,即如果父類方法用override修飾,如果子類繼承了該方法,也可以用override修飾,多層繼承中的多型就是這樣實現的。要想終止這種重寫,只需重寫方法時用sealed關鍵字進行修飾即可。

先在我們在來討論一下用abstract修飾的抽象方法。抽象方法只是對方法進行了定義,而沒有實現,如果乙個類包含了抽象方法,那麼該類也必須用abstract宣告為抽象類,乙個抽象類是不能被例項化的。對於類中的抽象方法,可以再其派生類中用override進行重寫,如果不重寫,其派生類也要被宣告為抽象類。看下面的例子。

public

abstract

class animal

public

class cat : animal

}public

class dog : animal

}public

class wolfdog : dog

}class tester}}

執行結果為:

cat eat...

dog eat...

wolfdog eat..

從上面可以看出,通過使用abstract-override可以和virtual-override一樣地實現多型,包括多層繼承也是一樣的。不同之處在於,包含虛擬方法的類可以被例項化,而包含抽象方法的類不能被例項化。

當然了,從上面可以看出,通過使用abstract-override可以和virtual-override一樣地實現多型,包括多層繼承也是一樣的。不同之處在於,包含虛擬方法的類可以被例項化,而包含抽象方法的類不能被例項化。

這裡簡單的提一下,多型實現中的虛方法,抽象方法,和介面還要再進行總結啊!士不可以不弘毅,任重而道遠啊。

C 學習之多型

多型性是物件導向程式設計中的乙個重要特徵,利用多型性可以設計和實現乙個易於拓展的系統。在c 語言中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式,發出同樣的訊息被不同型別的物件接收時,導致完全不同的行為。多型性通過聯編實現。聯編是指乙個電腦程式自身彼此關聯...

C 學習之多型

c 的類機制中有支援多型的技術來解決抽象程式設計,它用的是一種滯後 技術,這種技術,通過預先設定其成員函式的虛函式性質,使得任何 該成員函式的未定型別的物件操作在編譯時,都以乙個不確定的指標特殊地 引命代發 來編碼,到了執行時,遇到確定型別的物件,才突然制定其真正的行為。即滯後到執行時,根據具體型別...

c 學習之多型

多型分為兩類 1 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 2 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 1 靜態多型的函式位址早繫結 編譯階段確定函式位址 2 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 1 有繼承關係 2 子類重寫父類的...