首先抛出一个问题,c++标准委员会为什么要引入dynamic_cast?
从一门计算机程式语言发展与演变的角度来谈,那是因为c++引入dynamic_cast会让其变得更具有灵活性和弹性。为什么这样讲,首先我们要明白,任何最初美好的软件设计都会随着需求的增加以及代码的膨胀而会变得极其复杂。所以软件工程里特别强调软件设计要遵循开放封闭原则,这样会延长软件重构周期以及节约人力成本。OK, 下面我具体来谈dynamic_cast在程序设计过程中发挥的作用,以一个代码场景来引导大家去思考。假设我们使用了一个第三方的库,库中的基类封装并提供了相关的虚函数接口,我们实现自己的多个子类。当我们利用虚函数的动态机制避免重载提供统一的API时,我们面临的一个问题便是有时候我们需要在这个API里面对子类进行dispatch。显然,这正是dynamic_cast的用武之处!但很快也许有人会提出,为什么不在库的基类中增加一个enum类型? 这样可以通过switch这个枚举类型来进行dispatch,从而减少dynamic_cast运行时动态查询的开销。哈哈哈,问题提的真棒!试问库的设计者在设计这个库的时候,他能够预料到你们的使用场景吗?
至此,答案回归问题的出发点,c++引入dynamic_cast会让其变得更具有灵活性和弹性。