CRTP与虚函数动态多态的对比选择
CRTP(奇异递归模板模式)实现的静态多态和传统的虚函数动态多态在哪些方面有本质区别?各自的最佳使用场景是什么?为什么说CRTP适合高频调用而虚函数适合接口抽象?
回答
小字辈
本质上一个是编译期多态(CRTP),一个是运行时多态(虚函数)。CRTP通过基类static_cast<Derived*>(this)调用派生类方法,零运行时开销、可内联、不增加对象大小(vptr)。但:①不同类型不兼容(无法放入同一容器);②代码膨胀(每个实例化生成一份代码);③接口必须在编译期确定。虚函数:运行时多态,基类指针可指向任意派生类,适合插件体系、策略模式等需要运行时决策的场景;代价是vptr(增加对象大小)、间接调用损耗。选择建议:高频循环/性能关键→CRTP;需要运行时扩展/多态容器→虚函数;混合方案——CRTP内部实现算法,虚函数提供外部接口。C++20的concept+CRTP可提供更友好接口。