首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

VC++ bool vs BOOL 型別差異導致虛函式覆寫失敗:根因分析與跨平台型別對照表

     編輯:關於C語言

一、 錯誤現場

// 基類 (MFC CFrameWnd)
virtual BOOL OnCreateClient(LPCREATESTRUCT, CCreateContext*);

// 衍生類
virtual bool OnCreateClient(LPCREATESTRUCT, CCreateContext*); // 錯誤:bool vs BOOL

// 編譯錯誤 C2555: 虛函式回傳型別不同
// 'CMainFrame::OnCreateClient' : overriding virtual function differs from
// 'CFrameWnd::OnCreateClient' only by return type

二、 根因:兩個完全不同的型別

三、 導致覆寫失敗的機制

  • C++ 覆寫要求回傳型別協變 (Covariant Return Type) 或完全相同。
  • BOOL (int) 與 bool 大小、表示法、型別系統皆不同,非協變關係。
  • 編譯器視為「同名函式回傳型別衝突」而非合法覆寫,報錯 C2555。

四、 常見踩坑場景

  1. MFC/ATL/Windows API 回呼:基類用 BOOL,衍生類習慣寫 bool。
  2. 跨 DLL 介面:一方用 BOOL,另一方用 bool,二進制介面 (ABI) 不相容。
  3. 混合 C/C++ 編譯:C 用 int 模擬布林,C++ 用 bool,透過 extern "C" 傳遞。

五、 修正策略

  1. 統一用 BOOL:實作 Windows/MFC 介面時,嚴格遵循基類簽名 (BOOL, HRESULT, LRESULT 等 Windows 型別)。
  2. 內部邏輯用 bool:類內部私有函式、純 C++ 邏輯優先用 bool,介面層轉換:
    BOOL Wrapper() { return InternalLogic() ? TRUE : FALSE; }
  3. static_cast 明確轉換:return static_cast(condition); 避免隱式轉換警告。

六、 跨平台型別對照表 (Windows vs 標準 C/C++)

特性BOOL (Windows/MFC)bool (C++ 標準)
定義typedef int BOOL; (windef.h)內建關鍵字 (C++98 / C99 _Bool)
大小4 位元組 (int)1 位元組
值域任意 int (通常 0/非零)true (1) / false (0)
型別安全弱 (可隱式轉換任意整數)強 (不可隱式轉換整數)
標頭檔<windows.h>, <windef.h><cstddef> / 關鍵字

七、 總結

BOOL 是 Windows 歷史產物 (int),bool 是 C++ 標準布林型別 (1 byte)。介面層遵循平台規範 (Windows 用 BOOL),邏輯層使用標準型別 (bool),中間以明確轉換橋接。虛函式覆寫時,回傳型別必須與基類完全一致,容不得半點馬虎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
Windows 型別定義標準對應大小
BOOLtypedef int BOOLint / bool4
TRUE/FALSE1 / 0true / false-
BYTEunsigned charuint8_t1
WORDunsigned shortuint16_t2
DWORDunsigned longuint32_t4
LONGlongint32_t4
UINT_PTR指標大小無號整數uintptr_t4/8
LRESULTLONG_PTRintptr_t4/8
HANDLEvoid*void*4/8