全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1098
推到 Plurk!
推到 Facebook!

請問 HIDESBASE 是甚麼意思?

答題得分者是:miyu
ericchou
一般會員


發表:19
回覆:21
積分:8
註冊:2002-09-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-26 16:40:25 IP:202.175.xxx.xxx 未訂閱
這樣加在FUNCTION之前有甚麼用? 因我有一個C BUILDER program想用delphi改寫, 但不明此function有甚麼特別
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-30 20:09:31 IP:61.13.xxx.xxx 未訂閱
引言: 這樣加在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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-04 01:17:47 IP:202.175.xxx.xxx 未訂閱
雖然有些複雜, 但多謝你 希望可以盡量理解明白這些理論啦
系統時間:2024-11-25 11:30:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!