CRTP可以像调用虚拟函数一样调用子类方法,尽管在运行时解析了虚拟函数。
据我所知,在析构函数中调用虚拟函数是不安全的。CRTP也是一样的吗?使用CRTP调用子方法安全还是不安全?
编辑:
如果它不是不安全的,那么多重继承情况如何?例如,
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。调用CRTP的析构函数的函数安全吗?
发布于 2018-04-26 12:03:19
据我所知,在析构函数中调用虚拟函数是不安全的。CRTP也是一样的吗?使用CRTP调用子方法安全还是不安全?
这不安全。同样的考虑也适用。在构造函数或析构函数中,尚未/不再存在派生对象。因此,无论是通过CRTP调用其成员函数,还是通过使用虚拟函数进行欺骗,以及通过非虚拟成员间接进行定向,都会导致未定义的行为。
不幸的是,您的第二个示例仍然有未定义的行为。除了cv-合格的static_cast<>(this) void或void*,或者去基地 (而Run不是),您还可以使用其他任何东西。
https://stackoverflow.com/questions/50042466
复制相似问题