Is_Base_Of 特徵實現
is_base_of 特徵提供了一種方法來確定一個類別是否派生於另一個類,即使存在private 或受保護的繼承。它的實作依賴於函數模板和使用者定義轉換序列的巧妙使用。
工作原理
is_base_of 模板採用兩個模板參數,B 和 D,分別代表潛在的基類和派生類。它定義了兩個靜態成員函數:
然後使用 sizeof 初始化 is_base_of 的值靜態成員比較,它本質上檢查調用 Host 的檢查的結果的大小是否相同。物件等於「是」結果的大小(即陣列大小為 1)。
私有基礎繼承
此實作能夠處理私有基底繼承,因為 Host 類別提供了一個傳回 nullptr 的無運算運算子 B*() const。這允許編譯器在 check(B*, int) 函數中用 D* 取代 B*,即使 B 是 D 的私有基數。
Const 運算子B*() 宣告為const 至關重要,因為它確保編譯器選擇一個候選轉換函數,該函數將隱式物件參數this 作為非常量參考。這種微妙的差異允許 is_base_of 特徵透過檢查是否允許轉換為基底類型來區分公共繼承和私有繼承。
模板檢查函數
決定使用模板函數check(D*, T) 而不是非模板函數check(B*, int) 依賴重載解析規則。在搜尋轉換函數時,如果兩個函數同樣可行,則函數的傳回類型決定哪個比較好。透過使用傳回類型為 yes 的模板,它允許編譯器根據是否存在從 D* 到 B* 的使用者定義轉換來選擇正確的檢查版本。
以上是即使具有私有繼承,「is_base_of」特徵如何決定基底類別關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!