請問 HIDESBASE 是甚麼意思? |
答題得分者是:miyu
|
ericchou
一般會員 發表:19 回覆:21 積分:8 註冊:2002-09-25 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 這樣加在FUNCTION之前有甚麼用? 因我有一個C BUILDER program想用delphi改寫, 但不明此function有甚麼特別當你移植 Object Pascal 的virtual / override function到 BCB 時會用到. HIDESBASE 定義在 include/vcl/sysmac.h 中. 其原型為 #define HIDESBASE __declspec(hidesbase) HIDESBASE macro 的存在, 主要的目的是用來維護 Object Pascal 的語義. 根據 Object Pascal 規格書中的定義, 允許子代類別將函數名稱的命名和 父代類別的virtual function 相同, 並可以成為一個不在虛擬體系中的獨立 新函式. 理論聽起來很難懂, 換成 code 好了: type TPeople = class procedure Cook; virtual; // 是人都會弄點東西吃, 好不好吃能不能吃天知道 end; TFemale = class(TPeople) procedure Cook; override; // 因此, 女孩子也會弄東西吃 end; // 不過, 也聽過某人的學妹用洗衣粉去洗米的事件... XD TSakurabaAoi = class(TFemale) procedure Cook; override; // 小葵可是料理高手呢 end; TMahoro = class(TFemale) procedure Cook; override; // 麻晃也很會作菜, 不過她討厭 H 本 XD end; procedure Meow; var People: TPeople; SakurabaAoi: TSakurabaAoi; Mahoro: TMahoro; begin SakurabaAoi := TSakurabaAoi.Create(); People := SakurabaAoi; SakurabaAoi.Cook(); // 小葵要下廚了~~ People.Cook(); // 還是小葵去下廚~~ Mahoro := TMahoro.Create(); People := Mahoro; Mahoro.Cook(); // 麻晃要下廚囉~~ People.Cook(); // 還是麻晃要下廚~~ end;上面這個宣告, 構成了繼承體系. 我知道這個 Code 沒啥意義啦, 至於小葵跟麻晃是誰... XD 換成 C , 是這麼寫的: class TPeople { public: virtual void Cook(void); }; class TFemale : public TPeople { public: virtual void Cook(void); // 那個 virtual 可以省掉, 反正 Base class 是 }; // Virtual, 子代就一定是. class TSakurabaAoi : public TFemale { public: virtual void Cook(void); }; class TMahoro : public TFemale { public: virtual void Cook(void); };Object Pascal 有一點很好玩, 子代必需在 function 前加上 override 的 keyword, 才表示這個 function 成為 virtual function 的一員. 如果你這樣寫 Code (其他的不變): type TMahoro = class(TFemale) procedure Cook; // 麻晃也很會作菜, 不過她討厭 H 本 XD end;這個 function 在 Object pascal 中就不再位於虛擬體系中了. 它已經是一個新的, 獨立於這一代class中的函式了. 因此, 下面的 Code, 行為就會不一樣: procedure Meow; var People: TPeople; SakurabaAoi: TSakurabaAoi; Mahoro: TMahoro; begin SakurabaAoi := TSakurabaAoi.Create(); People := SakurabaAoi; SakurabaAoi.Cook(); // 小葵要下廚了~~ People.Cook(); // 還是小葵去下廚~~ Mahoro := TMahoro.Create(); People := Mahoro; Mahoro.Cook(); // 麻晃要下廚囉~~ People.Cook(); // Female 要下廚了!! end;請注意到, 在此, TMahoro 的 Cook function 已經切斷了和 Base Class 間的關係!! 因此, 如果你以一個Base Class pointer去指向該物件, 當呼叫虛擬函數的時候, 是呼叫到TFemale的 Cook(), 而不是 TMahoro 的 Cook(). 很明顯的你會發現到, C 跟 Object pascal 的不同. C 的規格書中規定, 一個 function, 只要其父代為 virtual function, 子代同名的function 將自動成為 virtual function. (這就是為什麼前面寫說 C 子代 class 其實可以不要宣告 virtual.. 不過寫上去人家比較不會搞混) 因此, Borland 只好使用一個 extension keyword 去處理掉這個問題. 照上面那段code, C 版的TMahoro宣告會變成這樣: class TMahoro : public TFemale { public: HIDESBASE void __fastcall Cook(void); };而如果沒有 HIDESBASE 冠在前面, 根據 C 的語意, TMahoro 的 Cook() function 將重載TFemale 的 Cook() function! 到底誰是小葵跟麻晃? XD --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 發表人 - Miyu 於 2003/08/30 20:20:23 |
ericchou
一般會員 發表:19 回覆:21 積分:8 註冊:2002-09-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |