compile-time polymorphism может быть реализован только через шаблоны.
CRTP vs. virtual-функций:
CRTP конструируется на этапе компиляции, а значит никакого оверхэда в runtime. Вызов виртуальной функции через ссылку на базовый класс требует вызова функции через указатель, за этот непрямой вызов приходится платить, а также это препятствует инлайнингу.
CRTP vs. имплементации всего в Derived
Переиспользование кода базового класса.