无法理解析构函数调用序列

时间:2014-08-15 06:16:22

标签: c++ inheritance destructor

class base{
    public:
        ~base(){
             cout<<"base class delete"<<endl;
        }   
};

class derived:public base{
    public:
        ~derived(){
            cout<<"derived class 1 delete"<<endl; 
        }
};

class derived2:public base,public derived{
    public:
        ~derived2(){
            cout<<"derived class 2 delete"<<endl;
        }
};

int main(){
    derived2 h; 
    return 0;
}

产生的输出是:

  

派生类2删除   
  派生类1删除   
  基类删除   
  基类删除

我知道析构函数是以构造函数的相反顺序调用的,但是我无法理解这个输出。任何人都可以解释一下这种行为吗?

4 个答案:

答案 0 :(得分:5)

1)从最派生到基数的反向顺序调用析构函数。

2)每个非虚拟基类的销毁都按其声明的相反顺序进行

所以在你的情况下:

我们从derived2开始,去它最后声明的基地(derived)来销毁它(摧毁derived然后base)然后再回来摧毁它其他基数,即base

有关详细信息和虚拟基础的一般情况,另请参阅this FAQ entry

答案 1 :(得分:0)

以反向声明顺序调用析构函数。因此,一旦调用derived2的析构函数,就会调用derived的dtor,而不是base。因此,基类的第三个输出由derived类调用。完成后,继承的derived2离开的一个类为base,因此第四个输出来自derived2类。

总结一下:

  1. 第一个输出来自derived2 class
  2. 第二个输出来自derived2 class继承的派生类
  3. 第三个输出来自派生类
  4. 继承的基类
  5. 第四个输出来自derived2 class继承的基类

答案 2 :(得分:0)

你看到这个破坏序列了吗?

derived 2 ==> derived 1 && base ==> base

说明:

  • (a)Derived 2的析构函数称为
  • (b)从(a)
  • 调用cout<<"derived class 2 delete"<<endl;
  • (c)调用Derived 1的析构函数。
  • (d)从(c)
  • 调用cout<<"derived class 1 delete"<<endl;
  • (e)从(c)
  • 调用基类的析构函数
  • (f)基类的目的地来自(a)

答案 3 :(得分:0)

析构函数以构造函数的相反顺序执行。

  • 在这里,破坏始于&#39; Class派生2&#39; (因此,首先调用它的析构函数。)

  • 然后通过调用它的destroctor:〜derived(){}来销毁最后一个继承的类(即派生类)。它继承了一个类,即类基类,因此它的描述符被称为:~base(){}。

  • 最后,由&#39; Class继承的第一个类派生2&#39;通过调用它的析构函数来销毁(即类基):~base(){}