簡體   English   中英

C ++虛擬析構函數

[英]C++ Virtual Destructors

如果我有一個基類和一個派生類,並且我在父虛擬中刪除了析構函數,但是實例化了一個類型為subclass的對象,當它被銷毀時它會調用父析構函數(從虛擬開始)? 如果我還在派生類中聲明了析構函數,它是否會調用析構函數(base和derived)。 提前致謝 :-)。

我的問題的第二部分是關於第一部分。 為什么需要將基類析構函數聲明為虛擬。 建設者不要循環起來。 它們沒有相同的名稱,所以需要它的位置? 對於破壞者來說它不應該是一樣的,或者默認只有一個叫做破壞者? 通過后期綁定也可以檢測到所有類和對象是由哪個組成的?

編輯:我的問題不僅僅是關於虛擬析構函數,而是為什么它需要被聲明為虛擬,因為它們都應該默認調用。

是的,將自動調用父析構函數。

析構函數應該被虛擬化,因此可以通過認為它具有對基類實例的引用的代碼來正確地銷毀派生實例。

非常有限的情況下,如果你真的需要在vtable查找上保存幾個周期,那么可以不虛擬化。

對虛擬析構函數的需求是因為多態性。 如果您有類似以下內容:

 class A { ... };

 class B : public A { ... };

 void destroy_class(A* input)
 {
     delete input;
 }

 int main()
 {
     B* class_ptr = new B();
     destroy_class(class_ptr); //you want the right destructor called

     return 0;
 }

雖然有點人為的例子,當你刪除destroy_class()函數的傳入指針時,你想要調用正確的析構函數。 如果class A的析構函數未聲明為virtual ,則只調用class A的析構函數,而不調用class B的析構函數或class A任何其他派生類型。

像這樣的東西通常是非模板多態數據結構等的事實,其中單個刪除函數可能必須刪除實際指向派生類型的對象的某些基類類型的指針。

rubixibuc,

是的,首先調用子類析構函數,然后調用它的超類...然后它是超類,依此類推,直到我們找到Object的析構函數。

更多信息: http//www.devx.com/tips/Tip/13059 ...值得一讀...只有一個屏幕已滿,但它是一個充滿信息的屏幕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM