dynamic_cast 的实现依赖于 RTTI,所以总是让人觉得它性能不行,使用这个东西多半会有一种犯了大忌的感受。 1、如果继承关系比较简单,比如 rectangle、circle 派生自 shape,只有两层,那么可以使用 variant 来代替虚函数多态。using shape = std::variant<rectangle*, circle*>; 当需要 downcast 的时候,可以直接从variant的index来查询当前实际的对象,使用get_if来进行转型。 实际上,在这种简单的场景下,dynamic_cast的性能也并不差,虚表中有记录偏移量,我怀疑使用dynamic_cast进行转型应该和variant是差不多的。 2、 如果继承关系比较复杂,variant可能无法适应这样的场景,只好使用传统虚函数多态。如果需要用到dynamic_cast,那么貌似 visitor 模式可以消除掉这种可能,比如:struct Visitor; struct West { virtual void accept(Visitor &visitor) = 0; // ... }; s......