繁体   English   中英

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

[英]Is it safe to use CRTP for destructor?

尽管可以在运行时解析虚拟函数,但是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的函数安全吗?

据我所知,在析构函数中调用虚拟函数并不安全。 CRTP是否也一样? 使用CRTP调用子方法是安全还是不安全?

这不安全。 同样的考虑也适用。 在构造函数或析构函数中, 尚无派生对象 因此,调用其成员函数(无论是通过CRTP还是通过虚函数欺骗和通过非虚成员进行间接调用)会导致未定义的行为。

不幸的是,第二个示例仍然具有未定义的行为。 除了cv限定的voidvoid*或者基数 (不是Run static_cast<>(this) ,都不能static_cast<>(this) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM