簡體   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