再次关于 dynamic_cast,一个真实的用例

主要观点:一般不建议使用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 上连接。
阅读 26
0 条评论