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中文網其他相關文章!