[英]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限定的void
或void*
, 或者基数 (不是Run
static_cast<>(this)
,都不能static_cast<>(this)
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.