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

时间:2018-04-26 12:00:57

标签: 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> {

};

这里,破坏的顺序是A-> CRTP-> Run。 在CRTP的析构函数中调用Run函数是否安全?

1 个答案:

答案 0 :(得分:7)

  

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

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

遗憾的是,您的第二个示例仍然存在未定义的行为。除了符合资格voidvoid*may not static_cast<>(this)Run不是),您or to a base以外的其他任何内容。