[英]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
的唯一原因是因為Root
和Object
是兼容的。 如果您嘗試使用兩種不兼容的類型,則會產生編譯器錯誤-在這種情況下,需要reinterpret_cast
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.