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删除
基类删除
基类删除
我知道析构函数是以构造函数的相反顺序调用的,但是我无法理解这个输出。任何人都可以解释一下这种行为吗?
答案 0 :(得分:5)
1)从最派生到基数的反向顺序调用析构函数。
2)每个非虚拟基类的销毁都按其声明的相反顺序进行
所以在你的情况下:
我们从derived2
开始,去它最后声明的基地(derived
)来销毁它(摧毁derived
然后base
)然后再回来摧毁它其他基数,即base
。
有关详细信息和虚拟基础的一般情况,另请参阅this FAQ entry。
答案 1 :(得分:0)
以反向声明顺序调用析构函数。因此,一旦调用derived2
的析构函数,就会调用derived
的dtor,而不是base
。因此,基类的第三个输出由derived
类调用。完成后,继承的derived2
离开的一个类为base
,因此第四个输出来自derived2
类。
总结一下:
答案 2 :(得分:0)
你看到这个破坏序列了吗?
derived 2 ==> derived 1 && base ==> base
说明:
cout<<"derived class 2 delete"<<endl;
cout<<"derived class 1 delete"<<endl;
答案 3 :(得分:0)
析构函数以构造函数的相反顺序执行。
在这里,破坏始于&#39; Class派生2&#39; (因此,首先调用它的析构函数。)
然后通过调用它的destroctor:〜derived(){}来销毁最后一个继承的类(即派生类)。它继承了一个类,即类基类,因此它的描述符被称为:~base(){}。
最后,由&#39; Class继承的第一个类派生2&#39;通过调用它的析构函数来销毁(即类基):~base(){}