xyl*_*per 0 c++ destructor crtp
虽然虚拟功能在运行时被解析,但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> {
};
Run Code Online (Sandbox Code Playgroud)
这里,破坏的顺序是A-> CRTP-> Run.在CRTP的析构函数中调用Run函数是否安全?
据我所知,在析构函数中调用虚函数是不安全的.CRTP也是如此吗?使用CRTP调用子方法是安全还是不安全?
这不安全.同样的考虑适用.在构造函数或析构函数中,还没有派生对象.所以调用它的成员函数,无论是通过CRTP还是通过虚拟函数作弊和通过非虚拟成员间接,都会导致未定义的行为.
不幸的是,你的第二个例子仍然有未定义的行为.你可能不static_cast<>(this)以任何其他比CV-合格void或void*,或到基地(这Run是不是).