将CRTP用于析构函数是否安全?

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函数是否安全?

Sto*_*ica 7

据我所知,在析构函数中调用虚函数是不安全的.CRTP也是如此吗?使用CRTP调用子方法是安全还是不安全?

这不安全.同样的考虑适用.在构造函数或析构函数中,还没有派生对象.所以调用它的成员函数,无论是通过CRTP还是通过虚拟函数作弊和通过非虚拟成员间接,都会导致未定义的行为.

不幸的是,你的第二个例子仍然有未定义的行为.你可能不static_cast<>(this)以任何其他比CV-合格voidvoid*,或到基地(这Run是不是).