删除超类是否会调用它的字段的析构函数?

时间:2014-10-31 20:45:35

标签: c++

我有以下代码:

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>类的析构函数,还是需要显式调用它?

2 个答案:

答案 0 :(得分:5)

一个类的析构函数总是调用所有子对象&#39;析构函数,与构造的顺序相反。

无论它们是虚拟基类,普通基类还是成员子对象都无关紧要。

virtual基类总是由最派生类直接构造和销毁,而不是由基类构造。
如果你通过既不是最衍生类型的指针来破坏一个对象,也没有拥有virtual dtor,那么所有的赌注都会被取消。)

答案 1 :(得分:0)

当一个类被破坏时,所有非指针成员的析构函数都会被自动调用。对于指向动态分配有new / new[]的对象的指针的任何成员,或者使用内存函数动态分配的内存块,您必须使用delete / {{1}自行释放它们或者适当的记忆功能。

是的,在此示例中,销毁delete[]实例将自动销毁其Node成员。