日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

delphi virtual dynamic

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 delphi virtual dynamic 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dynamic就是它是動態方法,沒有靜態地址,所以速度慢一點
virtual是虛方法,如果在基類中不聲明成虛方法的話,繼承后,該方法會提示一警告信息,把基類中方法屏蔽掉了

---------------------------------------------------------------

動態(Dynamic)和虛擬(Virtual)后都可以使用Override關鍵字在派生類中對對應方法進行覆蓋從而實現多態......

虛擬方法和動態方法在語義上可以說是等價的,他們唯一的區別在于對方法調用策略的內部實現上:虛擬方法從速度最優化的角度實現代碼優化,而動態方法則是從空間最優的角度實現代碼優化......

被覆蓋的動態方法在派生類的VMT中不再出現........所以節省空間........但查詢速度慢

被覆蓋的虛擬方法在怕生類的VMT中再次出現........所以查詢速度快......但浪費空間

---------------------------------------------------------------

虛擬方法和動態方法
?

要使一個方法成為虛擬的或動態的,需要在其聲明中包括指示字virtual或dynamic。虛擬方法和動態方法不同于靜態方法,它們可以在其后裔類中被覆蓋(overridden)。當一個覆蓋方法被調用時,方法調用中使用的類或對象的實際(運行時)類型決定了哪一個實現是有效的,而非變量聲明的類型決定。

要覆蓋一個方法,需要在再聲明中使用指示字override。一個override聲明必需與其祖先聲明在參數順序和類型以及結果(如果有)等各方面匹配。

下面的例子中,TFigure中聲明的Draw方法在兩個后裔類中都被覆蓋。

type
? TFigure = class
??? procedure Draw; virtual;
? end;
? TRectangle = class(TFigure)
??? procedure Draw; override;
? end;
? TEllipse = class(TFigure)
??? procedure Draw; override;
? end;

對于上面給出的聲明,下面的代碼舉例說明了在運行時通過一個變量調用虛擬方法時,其類型變化的效果。
var
? Figure: TFigure;
begin
? Figure := TRectangle.Create;
? Figure.Draw;? //調用的是TRectangle.Draw
? Figure.Destroy;
? Figure := TEllipse.Create;
? Figure.Draw;? //調用的是TEllipse.Draw
? Figure.Destroy;
end;

只有虛擬方法和動態方法可以被覆蓋。然而,所有的方法都可以被重載(overloaded),見重載方法。

虛擬和動態
虛擬方法和動態方法在語義上是等價的。其不同之處僅在于運行時對方法調用如何實現調度。
虛擬方法在速度方面相對更優化,而動態方法在代碼尺寸方面相對更優化。

一般情況下,虛擬方法是實現多種行為最有效的途徑。當一個基本類聲明了許多可覆蓋的方法,并且在應用程序中將被許多后裔類繼承但很少覆蓋時,動態方法是有用的。?
本文來自Delphi之窗,原文地址:http://www.52delphi.com

總結

以上是生活随笔為你收集整理的delphi virtual dynamic的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。