| 問題 | 答案 |
|---|---|
| 1. 基類解構函數非 virtual,刪除派生類對象時,基類解構函數會被呼叫嗎? | 會。無論是否 virtual,派生類解構時會自動呼叫基類解構函數(按派生→基類順序)。 |
| 2. 基類指標指向派生類對象,基類解構函數非 virtual,delete 基類指標時,派生類解構函數會被呼叫嗎? | 不會。僅呼叫基類解構函數,導致派生類資源洩漏。基類解構函數必須宣告為 virtual。 |
| 3. 虛基類的解構函數是否自動為 virtual? | 否。虛基類僅解決多重繼承鑽石問題,解構函數仍需手動加 virtual。 |
class Base {
public:
virtual ~Base() { cout << "Base dtor\n"; } // 必須 virtual
};
class Derived : public Base {
public:
~Derived() { cout << "Derived dtor\n"; }
};
// 使用
Base *p = new Derived();
delete p; // 正確輸出 Derived dtor → Base dtor