[英]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.