在C 中定義抽象基底類別時,可能會傾向於將虛擬析構函數宣告為純虛擬,如下面的程式碼片段所示:
class A { public: virtual ~A() = 0; };
雖然此語法在某些編譯器中有效,例如與MSVC一樣,它會帶來潛在的危險,可能導致運行時崩潰。
上面程式碼的問題是虛擬析構函數被宣告為純析構函數,沒有提供實作。這意味著析構函數的行為被委託給具體的衍生類別。然而,如果 A 類型的物件本身被銷毀,它的析構函數將被調用,並且它的缺乏實現將導致未定義的行為。
在典型場景中,派生從抽象基類 A 中調用並嘗試銷毀派生類的對象最終將調用 A 的析構函數。如果沒有實現,這可能會在某些平台上觸發未定義的行為,例如呼叫 purecall 處理程序並使程式崩潰。
為了解決此問題,抽象基類類的析構函數應該顯式實現,即使它的主體是空的。下面更正的程式碼片段示範了這一點:
class A { public: virtual ~A() = 0; }; inline A::~A() { }
透過為 A 的析構函數提供空實現,可以確保在直接呼叫或透過衍生類別呼叫時定義其行為。
以上是C 中是否應該實作純虛擬析構函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!