DELPHI中的靜態虛擬及動態方法函式的區別。 (轉)
DELPHI中的靜態虛擬及動態方法函式的區別。 (轉)[@more@]
1、靜態方法是方法的預設型別,對它就像對通常的過程和那樣,知道這些方法的地址,所以呼叫一個靜態方法時它能把執行資訊靜態地連結進可,所以,靜態方法速度最快,但它們卻不能被覆蓋來支援多型性。
2、虛擬方法和靜態方法的呼叫方式相同。由於虛擬方法能被覆蓋,在程式碼中呼叫一個指定的虛擬方法時編譯器並不知道它的地址,因此,編譯器透過建立虛擬方法表(VMT)來查詢在執行時的函式地址。所有的虛擬方法在執行時透過VMT來高度,一個的VMT表中除了自己定義的虛擬方法外,還有它的祚的所有的虛擬方法,因此虛擬方法比動態方法用的要多,但它執行得比較快。
3、動態方法跟虛擬方法基本相似,只是它們的高度不同。編譯器為每一個動態方法指定一個獨一無二的數字,用這個數字和動態方法的地址構造一個動態方法表(DMT)。不像VMT表,在DMT表中僅有它宣告的動態方法,並且這個方法需要祖先的DMT表來訪問它蓁的動態方法。正因為這樣動態方法比虛擬方法用的記憶體要少,但執行起來羅慢,因為有可能要到祚物件的DMT中查詢動態法。
4、OP透過覆蓋使一方法在不同的派生類間表現出不同的行為。OP中能被覆蓋的方法是在宣告時被標識為virtual或dynamic的方法。為了覆蓋一個方法,在派生類的宣告中用overr代替virtual或dynamic。用了override後,編譯器就會用新的方法替換VMT中原先的方法,而原先的方法也還存在,而如果用override再次宣告一個靜態方法,則是真正的覆蓋,是用新的方法完全替換在祖先類中的同明方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989460/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Delphi系列談之:Delphi中的靜態屬性及靜態方法的實現 (轉)
- 偽靜態、靜態和動態的區別
- 靜態SDRAM和動態SDRAM的區別
- 動態庫和靜態庫的區別
- Java中靜態跟非靜態的區別總結Java
- ios 開發中 動態庫 與靜態庫的區別iOS
- Delphi 類的靜態屬性 (轉)
- 動態IP與靜態IP的主要區別
- ios靜態庫與動態庫的區別iOS
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- 靜態網頁與動態網頁的區別網頁
- 動態圖和靜態圖的程式碼區別
- 靜態網頁和動態網頁的區別網頁
- VB動態呼叫外部函式的方法 (轉)函式
- Python 靜態方法和類方法的區別Python
- 【知識分享】動態ip和靜態ip的區別
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C++純虛擬函式簡介及區別C++函式
- C#靜態建構函式及靜態變數學習C#函式變數
- apache動態編譯/靜態編譯區別Apache編譯
- 動態連結庫和靜態連結庫的區別
- BootStrap的動態模態框及靜態模態框boot
- 函式的動態引數 及函式巢狀函式巢狀
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- 函式的靜態變數 static函式變數
- Jni函式的靜態繫結函式
- .NET偽靜態使用以及和純靜態的區別
- 動態IP和靜態IP有什麼區別?
- 從零玩轉jQuery-核心函式和靜態方法jQuery函式
- 網站偽靜態和純靜態區別網站
- PHP 中 static 靜態屬性和靜態方法的呼叫PHP
- CE的使用及靜態地址與動態地址
- 伺服器動態ip和靜態ip的區別和特點伺服器
- oracle監聽器動態註冊於靜態註冊的區別Oracle
- oracle 10g 中的靜態及動態註冊問題Oracle 10g
- 【科普】靜態IP和動態IP有什麼區別?
- 【普】靜態IP和動態IP有什麼區別?
- 類內的靜態成員函式函式