CRTP не обеспечивает полиморфизм во время выполнения .Если вам нужен полиморфизм времени выполнения, вам нужны виртуальные методы.Хуже того, поскольку базовый класс является шаблонным, вы даже не можете использовать объекты подкласса так, как если бы они были того же типа, что и базовый класс, поскольку вы не можете привести их к этому базовому классу - он не существует;это просто шаблон.
Я думаю, что более полезный способ размышления о CRTP-замене полиморфизма - это не замена виртуального наследования, а скорее форма миксинов .Вы не делаете подклассы в обычном смысле;вместо этого вы добавляете в свой класс готовые функции.
Пример миксина: пример миксина будет выглядеть примерно так: зависит от.Такой миксин может содержать список указателей на другие элементы того же типа, от которых зависит этот элемент;он добавил бы метод register_dependency
, который добавляет объект, от которого он зависит, и visit_dependents
, который посещает все его зависимости в (обратном?) топологическом порядке.Другим примером может быть то, что добавляет метод compute_area
ко всему, что само содержит методы width
и height
.Или что угодно ...
Если вы думаете об этом как о замене иерархии типов, вы просто усложняете понимание, усложняете отладку кода, который не совсем работает так, как должен.Если вам действительно не нужно увеличение производительности (если оно есть - не гарантировано), это звучит как плохая идея.Если вы делаете это для быстрого склеивания некоторых лишних битов, но без концептуального веса наследования, я бы сказал, что у вас все хорошо - «настоящее» наследование не так часто необходимо.