【发布时间】:2022-01-14 03:03:39
【问题描述】:
我看到我们可以使用 CRTP 引入某种编译时多态性,但是我想知道这怎么能比好的旧虚函数更好。最后我们必须调用static_cast<const T*>(this)->implementation();,这是一个与vtable 完全一样的间接级别。
它们有何不同?有什么优势吗?我只看到它们不能被基类破坏的缺点。在我看来,它作为一个学术示例看起来不错,但主要是常规多态性。
【问题讨论】:
-
根据 Anger 的优化书,“我们可以通过避免使用虚函数分派机制节省的几个时钟周期不足以证明如此复杂的代码是难以理解的,因此难以维护。如果编译器能够自动进行去虚拟化,那么依靠编译器优化肯定比使用这种复杂的模板方法更方便。”
-
考虑this clone pattern。如果没有 CRTP,您将需要在每个派生类中定义
clone()虚函数。使用 CRTP,您只需定义一次。 CRTP 在这里不是虚拟功能的替代品。相反,这两种机制结合在一起。
标签: c++ polymorphism crtp