主要观点:一般不建议使用dynamic_cast
,因其会使代码可读性变差,但在某些情况下无法或没必要去除dynamic_cast
,如通过dynamic_cast
借助版本控制来处理 SDK 接口版本更新的问题。
关键信息:
- 通常通过去除
dynamic_cast
依赖动态调度和更好的抽象来避免其带来的问题。 - 示例中 SDK 接口不断更新,通过不同“版本化”接口继承来防止用户代码崩溃,通过
dynamic_cast
在运行时确定实现的接口。 - 提出其他解决方案,如引入
ServiceVersion
标签,通过static_cast
根据版本进行处理,但存在恶意或无知客户端覆盖getVersion
导致问题;还可隐藏ServiceVersion
,用InterfaceForSomeServiceVersion
包装;或者通过双继承扩展继承树,使客户端无法覆盖getVersion
。
重要细节: - 代码示例中展示了不同解决方案的具体实现及存在的问题,如使用不同重载处理接口版本时会出错,恶意覆盖
getVersion
可能导致分段错误等。 - 结论认为总体上放弃 RTTI 和
dynamic_cast
能使代码更可读,但此案例中dynamic_cast
使事情更简单安全,若不能使用 RTTI 则有替代方案。 - 最后呼吁点赞、订阅 newsletter 及在 Twitter 上连接。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。