首頁 > 後端開發 > C++ > 主體

為什麼建構函式和析構函式會發生「純虛函式呼叫」崩潰?

DDD
發布: 2024-11-11 17:28:02
原創
516 人瀏覽過

Why Do

揭開「純函數呼叫」崩潰之謎

當遇到神祕的錯誤訊息「純虛函數呼叫」時,使用者可能會想知道儘管無法實例化抽象類別的對象,程式如何能夠編譯。此問題源自於嘗試在建構函式或析構函式中呼叫虛函式。

編譯器的困境:

在物件建立期間,建構子負責初始化物件的狀態。相反,析構函數處理物件銷毀。但是,在這些階段無法進行虛擬函數調用,因為派生類別物件不完整或不存在。

在這種情況下,編譯器將呼叫虛擬函數的基底類別版本。然而,由於純虛函數在基類中缺乏實現,這會導致臭名昭著的“純虛函數呼叫”錯誤。

用於說明的程式碼片段:

考慮以下C 範例:

class Base {
public:
    Base() {
        reallyDoIt(); // INCORRECT, doesn't work
    }
    void reallyDoIt() { doIt(); } // INCORRECT, doesn't work
    virtual void doIt() = 0; // Pure virtual function
};

class Derived : public Base {
    void doIt() {} // Overrides pure virtual function
};

int main() {
    Derived d; // Causes "pure virtual function call" error
}
登入後複製

實例化派生類別時,程式嘗試從建構子呼叫realDoIt(),建構子再呼叫doIt()。由於doIt()是純虛函數,基底類別中沒有實現,導致致命錯誤。

結論:

防止「純虛」函數呼叫」崩潰,避免在構造函數或析構函數中進行虛函數呼叫至關重要。這確保在物件建立和銷毀期間僅呼叫衍生類別特有的方法,從而防止呼叫基底類別中未定義的函數。

以上是為什麼建構函式和析構函式會發生「純虛函式呼叫」崩潰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板