2014-10-31 32 views
-2

我有以下代碼:是否刪除它的字段的超類調用析構函數?

template<class T> 
class List<T> { 
    class Node{ 
     T data; 
     Node * next; 
     ... 
    }; 
    Node * head; 
    ... 
    ~List() {/*iterating through all nodes and deleting them*/} 
    ... 
}; 

template<class T> 
class Tree<T> { 
    class Node { 
     Node * next; 
     ... 
     T key; 
     List<int> internal_list; 
    }; 
    destroy_node(Node * x) { delete x; } 
}; 

是否destroy_node(Node * x)調用List<T>類的析構函數或者我需要顯式調用呢?

+0

這有點令人困惑,因爲你有兩次Node作爲嵌套類。刪除Tree :: Node將調用Tree :: Node :: internal_list的析構函數 – 2014-10-31 20:49:21

回答

5

是的。

一個類的析構函數總是以相反的構造順序調用所有子對象的析構函數。

無論它們是虛擬基類,普通基類還是成員子對象,都無關緊要。

virtual基類總是構造和由最底層派生類直接破壞,​​從未被一個基類。
如果你通過指針銷燬對象既不的最派生類型,也不具有)

+0

嗯..如何多說一點關於虛擬的東西,因爲有人可能會誤解「總是」,並認爲「刪除foo」會神奇地做所有事情。我的意思是,如果處理不當,非虛擬析構函數可能會忽略一些東西,所以這不是100%「總是」,例如99.5%:) – quetzalcoatl 2014-10-31 21:04:12

+0

@quetzalcoatl:增加了兩個句子來解決這些附加問題。 – Deduplicator 2014-10-31 21:15:37

0

當一個類被破壞時,它的所有非指針成員的析構函數會被自動調用。對於指向動態分配爲new/new[]的對象的任何成員,或者使用記憶功能動態分配的內存塊,必須分別使用delete/delete[]或適當的內存函數自己釋放它們。

所以是的,在這個例子中,銷燬一個Node實例會自動破壞它的internal_list成員。

+3

析構函數調用所有子組件的析構函數,不管它是否是自定義的。 – 2014-10-31 20:53:16

+0

我改正了我的答案。 – 2014-10-31 20:55:01

+2

說一個班級的成員是否是「自動」是不正確的。 – 2014-10-31 20:55:38

相關問題