多態(tài)分為哪兩種 C 多態(tài)是怎么實(shí)現(xiàn)的?
C 多態(tài)是怎么實(shí)現(xiàn)的?C的多態(tài)實(shí)現(xiàn)主要包括函數(shù)重載(包括操作符函數(shù))、模板和虛函數(shù)。其目的是用相同的函數(shù)名調(diào)用不同的函數(shù)體,以提高程序的可重用性和可擴(kuò)展性。函數(shù)重載和模板是靜態(tài)組合的,即函數(shù)調(diào)用的所
C 多態(tài)是怎么實(shí)現(xiàn)的?
C的多態(tài)實(shí)現(xiàn)主要包括函數(shù)重載(包括操作符函數(shù))、模板和虛函數(shù)。其目的是用相同的函數(shù)名調(diào)用不同的函數(shù)體,以提高程序的可重用性和可擴(kuò)展性。
函數(shù)重載和模板是靜態(tài)組合的,即函數(shù)調(diào)用的所有信息在編譯時(shí)確定。函數(shù)重載可以是類(lèi)的成員函數(shù)和友元函數(shù),也可以是類(lèi)外的普通函數(shù)。實(shí)際參數(shù)的個(gè)數(shù)或“類(lèi)型和順序”用于確定特定的調(diào)用,因此定義時(shí),這些同名函數(shù)的形式參數(shù)或“類(lèi)型和順序”的個(gè)數(shù)必須不同。
虛擬函數(shù)采用動(dòng)態(tài)綁定方式,允許在運(yùn)行時(shí)建立函數(shù)調(diào)用與函數(shù)體的連接,并根據(jù)對(duì)象類(lèi)型調(diào)用相應(yīng)的函數(shù)。虛函數(shù)必須是類(lèi)的成員函數(shù)(非靜態(tài)成員函數(shù))。它必須在基類(lèi)中聲明,并在派生類(lèi)中重新定義。此外,它的函數(shù)類(lèi)型、函數(shù)名、參數(shù)個(gè)數(shù)和順序必須與基類(lèi)中的函數(shù)原型完全相同。具體調(diào)用需要通過(guò)基類(lèi)指針指向派生類(lèi)對(duì)象來(lái)獲得運(yùn)行時(shí)多態(tài)性,并根據(jù)指針指向的實(shí)際對(duì)象調(diào)用成員函數(shù)。
簡(jiǎn)單列出使用虛擬函數(shù)的兩個(gè)注意事項(xiàng)。
1)運(yùn)行時(shí)多態(tài)性只能通過(guò)通過(guò)基類(lèi)指針訪(fǎng)問(wèn)虛擬函數(shù)來(lái)獲得。直接使用派生類(lèi)對(duì)象和點(diǎn)運(yùn)算符也可以調(diào)用虛函數(shù),但它沒(méi)有利用其多態(tài)性。
2)在派生類(lèi)中重新定義虛函數(shù)時(shí),如果其參數(shù)的個(gè)數(shù)、類(lèi)型和順序與基類(lèi)的虛函數(shù)原型不同,系統(tǒng)會(huì)將其作為普通函數(shù)重載進(jìn)行靜態(tài)綁定,因此無(wú)論如何調(diào)用,都不會(huì)有運(yùn)行多態(tài)性。
多態(tài)的好處?
1. 改進(jìn)代碼維護(hù)(繼承保證)2、提高代碼可伸縮性(多態(tài)保證)多態(tài)性:相同的操作作用于不同的對(duì)象,可以有不同的解釋?zhuān)a(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過(guò)指向基類(lèi)的指針調(diào)用派生類(lèi)中的方法。擴(kuò)展數(shù)據(jù)多態(tài)性:將不同的子類(lèi)對(duì)象作為父類(lèi)處理,可以屏蔽不同子類(lèi)對(duì)象之間的差異,編寫(xiě)通用代碼,進(jìn)行通用編程,以適應(yīng)不斷變化的需求。賦值后,父類(lèi)型的引用可以根據(jù)當(dāng)前分配給它的子對(duì)象的特性以不同的方式進(jìn)行操作。也就是說(shuō),父親的行為像兒子,兒子的行為不像父親。
什么是多態(tài)?java中如何實(shí)現(xiàn)多態(tài)?
多態(tài)性分為編譯時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性。
1. 編譯時(shí)多態(tài)性,其實(shí)是方法重載,函數(shù)名相同,但簽名不一樣。值得注意的是,簽名不包括方法的返回值。換句話(huà)說(shuō),這兩個(gè)方法的函數(shù)名和輸入?yún)?shù)是相同的,但返回值不同。編譯器返回錯(cuò)誤。
2. 運(yùn)行時(shí)多態(tài)性實(shí)際上與繼承和接口實(shí)現(xiàn)有關(guān)。子類(lèi)可以重寫(xiě)父類(lèi)的非最終、非靜態(tài)、非私有方法或?qū)崿F(xiàn)接口方法。JVM如何知道要調(diào)用哪個(gè)子類(lèi)實(shí)例的對(duì)應(yīng)方法?這就是你問(wèn)的問(wèn)題。在Java中,對(duì)象在JVM中有描述元數(shù)據(jù)。對(duì)象頭存儲(chǔ)當(dāng)前實(shí)例的類(lèi)型信息。在調(diào)用時(shí),JVM可以根據(jù)這個(gè)類(lèi)型準(zhǔn)確地找出要使用的子類(lèi)方法。