CRTP может вызывать метод дочернего класса, например, виртуальную функцию, хотя виртуальная функция разрешается во время выполнения.
Насколько я знаю, вызывать виртуальную функцию в деструкторе небезопасно.
То же самое верно для CRTP?
Безопасно или небезопасно вызывать дочерний метод с использованием CRTP?
Edit:
Если это небезопасно, как насчет случая множественного наследования?
Например,
template<typename T, typename V>
struct CRTP {
~CRTP()
{
static_cast<V*>(static_cast<T*>(this))->run();
}
};
struct Run {
void run() { std::cout << "run" << std::endl; }
};
struct A : Run, CRTP<A, Run> {
};
Здесь порядок уничтожения: A-> CRTP-> Run.
Безопасно ли вызывать функции Run в деструкторе CRTP?