首頁 >後端開發 >C++ >C 中的抽象基底類別應該有純虛擬析構函數嗎?

C 中的抽象基底類別應該有純虛擬析構函數嗎?

Linda Hamilton
Linda Hamilton原創
2024-12-28 06:21:17807瀏覽

Should Abstract Base Classes in C   Have Pure Virtual Destructors?

C 中的純虛擬析構函數

在物件導向程式設計的世界中,抽象基底類別通常需要純虛擬析構函數。然而,在編寫以下程式碼時會出現問題:

class A {
public:
    virtual ~A() = 0;
};

這提出了一個問題:抽象基底類別擁有純虛擬析構函數是否可以接受。雖然 Microsoft Visual C 編譯它沒有問題,但運行時會發生什麼?

答案是:未定義的行為。如果從 A 派生的類別的實例被刪除或銷毀,則將呼叫 A 的析構函數。然而,由於它是純粹虛擬的並且缺乏實現,這會觸發未定義的行為。在某些平台上,這可能會導致呼叫 purecall 處理程序,從而導致崩潰。

為了避免這種情況,實現析構函數也至關重要。像這樣的最小實作就足夠了:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

這樣,當衍生類別的實例被刪除時,A 的析構函數不會導致未定義的行為。

以上是C 中的抽象基底類別應該有純虛擬析構函數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn