繁体   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