揭開「純函數呼叫」崩潰之謎
當遇到神祕的錯誤訊息「純虛函數呼叫」時,使用者可能會想知道儘管無法實例化抽象類別的對象,程式如何能夠編譯。此問題源自於嘗試在建構函式或析構函式中呼叫虛函式。
編譯器的困境:
在物件建立期間,建構子負責初始化物件的狀態。相反,析構函數處理物件銷毀。但是,在這些階段無法進行虛擬函數調用,因為派生類別物件不完整或不存在。
在這種情況下,編譯器將呼叫虛擬函數的基底類別版本。然而,由於純虛函數在基類中缺乏實現,這會導致臭名昭著的“純虛函數呼叫”錯誤。
用於說明的程式碼片段:
考慮以下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中文網其他相關文章!