Я думаю, причина этого в том, что если вы создаете этот код:
void method2()
{
static_cast<Derived*>(this)->method2();
}
, где Derived
не имеет реализации method2()
, по сути будет прославленным саморекурсивным вызовом. Причина в том, что в Derived1
действительно есть функция-член под названием method2
, а именно та, которая унаследована от базового класса.
Я попытался запустить этот код, и, конечно же, вызов method2
вызвал переполнение стека из-за саморекурсии.
Обычно CRTP избегает этого, поскольку функция базового класса не вызывает функцию производного класса с тем же именем. Таким образом, если в производном классе отсутствует определенная функция, вызов вызывает ошибку компилятора. В вашем случае этого не происходит, потому что на саму функцию можно ссылаться косвенно из базового класса.