首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CRTP作为析构函数安全吗?

使用CRTP作为析构函数安全吗?
EN

Stack Overflow用户
提问于 2018-04-26 12:00:57
回答 1查看 259关注 0票数 0

CRTP可以像调用虚拟函数一样调用子类方法,尽管在运行时解析了虚拟函数。

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

编辑:

如果它不是不安全的,那么多重继承情况如何?例如,

代码语言:javascript
复制
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的析构函数的函数安全吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-26 12:03:19

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

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

不幸的是,您的第二个示例仍然有未定义的行为。除了cv-合格的static_cast<>(this) voidvoid*或者去基地 (而Run不是),您还可以使用其他任何东西。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50042466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档