簡體   English   中英

在此特定上下文中,從基層到派生的static_cast是否被視為“安全”?

[英]Is static_cast from base to derived considered “safe” in THIS particular context?

在多態分層結構樹的樹中,只有Root類型實例的_parent null 我正在使用此方法來獲取特定樹節點的根對象:

inline Root * root() {
    Object * r = this;
    while (r->_parent) r = r->_parent;
    return static_cast<Root *>(r);
}

我一直在讀,從基到派生的靜態轉換通常不被認為是安全的,但是對於我的特殊情況呢?在這個特殊情況下,可以通過null _parent標識Root類型?

只要保持不變就可以了。 但是,在大型代碼庫的大部分內容上強制執行的不變式很少保持不變。

至少,我會在此處插入Assert(dynamic_cast<...>(...)) ,並在每個位置修改parent ,以嘗試在調試中強制執行不變式。

另一種方法是公開virtual Root* as_root() ,該方法僅在Root返回非nullptr 這比(大多數) static_cast更昂貴,但是將轉換邏輯放置在可搜索的中央位置。 這種virtual調用很少是程序的瓶頸。

更有意思的是,“如果沒有找到Root怎么辦? 返回nullptr可能,這意味着在所有調用點處理它,至少在水平Assert在調試荷蘭國際集團。 如果假定呼叫站點不處理它,則返回一個Root& ,並在調試Assert失敗呼叫終止/退出(在Assert之后)(如果在日志/通知/等之后在那里進行檢查,則釋放或終止)。

如果您知道r屬於Root類型,則靜態強制轉換是完全安全的。 實際上,編譯器允許您在此上下文中使用static_cast的唯一原因是因為RootObject是兼容的。 如果您嘗試使用兩種不兼容的類型,則會產生編譯器錯誤-在這種情況下,需要reinterpret_cast

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM