DELPHI中的靜態(tài)虛擬及動(dòng)態(tài)方法函數(shù)的區(qū)別
發(fā)表時(shí)間:2024-02-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1、靜態(tài)方法是方法的缺省類型,對(duì)它就像對(duì)通常的過(guò)程和函數(shù)那樣調(diào)用,編譯器知道這些方法的地址,所以調(diào)用一個(gè)靜態(tài)方法時(shí)它能把運(yùn)行信息靜態(tài)地鏈接進(jìn)可執(zhí)行文件,所以,靜態(tài)方法速度最快,但它們卻不能被覆蓋來(lái)支持多態(tài)性。2、虛擬方法和靜態(tài)方法的調(diào)用方式相同。由于虛擬方法能被覆蓋,在代碼中調(diào)用一個(gè)指定的虛擬方法...
1、靜態(tài)方法是方法的缺省類型,對(duì)它就像對(duì)通常的過(guò)程和函數(shù)那樣調(diào)用,編譯器知道這些方法的地址,所以調(diào)用一個(gè)靜態(tài)方法時(shí)它能把運(yùn)行信息靜態(tài)地鏈接進(jìn)可執(zhí)行文件,所以,靜態(tài)方法速度最快,但它們卻不能被覆蓋來(lái)支持多態(tài)性。
2、虛擬方法和靜態(tài)方法的調(diào)用方式相同。由于虛擬方法能被覆蓋,在代碼中調(diào)用一個(gè)指定的虛擬方法時(shí)編譯器并不知道它的地址,因此,編譯器通過(guò)建立虛擬方法表(VMT)來(lái)查找在運(yùn)行時(shí)的函數(shù)地址。所有的虛擬方法在運(yùn)行時(shí)通過(guò)VMT來(lái)高度,一個(gè)對(duì)象的VMT表中除了自己定義的虛擬方法外,還有它的祚的所有的虛擬方法,因此虛擬方法比動(dòng)態(tài)方法用的內(nèi)存要多,但它執(zhí)行得比較快。
3、動(dòng)態(tài)方法跟虛擬方法基本相似,只是它們的高度系統(tǒng)不同。編譯器為每一個(gè)動(dòng)態(tài)方法指定一個(gè)獨(dú)一無(wú)二的數(shù)字,用這個(gè)數(shù)字和動(dòng)態(tài)方法的地址構(gòu)造一個(gè)動(dòng)態(tài)方法表(DMT)。不像VMT表,在DMT表中僅有它聲明的動(dòng)態(tài)方法,并且這個(gè)方法需要祖先的DMT表來(lái)訪問(wèn)它蓁的動(dòng)態(tài)方法。正因?yàn)檫@樣動(dòng)態(tài)方法比虛擬方法用的內(nèi)存要少,但執(zhí)行起來(lái)羅慢,因?yàn)橛锌赡芤届駥?duì)象的DMT中查找動(dòng)態(tài)法。
4、OP通過(guò)覆蓋使一方法在不同的派生類間表現(xiàn)出不同的行為。OP中能被覆蓋的方法是在聲明時(shí)被標(biāo)識(shí)為virtual或dynamic的方法。為了覆蓋一個(gè)方法,在派生類的聲明中用override代替virtual或dynamic。用了override后,編譯器就會(huì)用新的方法替換VMT中原先的方法,而原先的方法也還存在,而如果用override再次聲明一個(gè)靜態(tài)方法,則是真正的覆蓋,是用新的方法完全替換在祖先類中的同明方法。