虽然虚拟函数在运行时被解析,但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的析构函数中调用Run函数是否安全?
答案 0 :(得分:7)
据我所知,在析构函数中调用虚函数是不安全的。 CRTP也是如此吗?使用CRTP调用子方法是安全还是不安全?
这不安全。同样的考虑适用。在构造函数或析构函数中,还有没有派生对象。所以调用它的成员函数,无论是通过CRTP还是通过虚拟函数作弊和通过非虚拟成员间接,都会导致未定义的行为。
遗憾的是,您的第二个示例仍然存在未定义的行为。除了符合资格void
或void*
,may not static_cast<>(this)
(Run
不是),您or to a base以外的其他任何内容。