[英]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.