C++ 无法理解析构函数调用序列 类基{ 公众: ~base(){ cout
析构函数是按相反的声明顺序调用的。因此,一旦调用了C++ 无法理解析构函数调用序列 类基{ 公众: ~base(){ cout,c++,inheritance,destructor,C++,Inheritance,Destructor,析构函数是按相反的声明顺序调用的。因此,一旦调用了derived2的析构函数,则调用derived的dtor,而不是base。因此,基类的第三个输出由derived2类调用。一旦调用完成,继承的derived2剩下的一个类将被调用base,因此第四个输出来自derived2类。 总结如下: 第一个输出来自derived2类 第二个输出来自由derived2类继承的派生类 第三个输出来自派生类继承的基类 第四个输出来自由derived2类继承的基类 析构函数是按相反的声明顺序调用的。因此,一旦调
derived2
的析构函数,则调用derived
的dtor,而不是base
。因此,基类的第三个输出由derived2
类调用。一旦调用完成,继承的derived2
剩下的一个类将被调用base
,因此第四个输出来自derived2
类。总结如下:
析构函数是按相反的声明顺序调用的。因此,一旦调用了
derived2
的析构函数,则调用derived
的dtor,而不是base
。因此,基类的第三个输出由derived2
类调用。一旦调用完成,继承的derived2
剩下的一个类就是 基本
,因此第四个输出来自derived2
类。总结如下:
derived2
开始,到它最后声明的基(derived
)销毁它(销毁derived
,然后销毁base
),然后回来销毁另一个基,即base
有关虚拟基的更多详细信息和一般情况,请参见。1)析构函数按从最派生基到基的相反顺序调用
2)每个非虚拟基类的销毁顺序与其声明顺序相反
因此,在你的情况下:
我们从一个derived2
开始,到它最后声明的基(derived
)销毁它(销毁derived
,然后销毁base
),然后回来销毁另一个基,即base
有关更多详细信息和虚拟基地的一般情况,请参见。您是否看到这种销毁顺序:
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;
}
说明:
- (a) 调用派生2的析构函数
- (b)
cout你看到这种破坏顺序了吗:
说明: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; }
- (a) 调用派生2的析构函数
- (b)
cout析构函数按与构造函数相反的顺序执行
- 这里,销毁从“类派生2”开始(因此,它的析构函数被称为第一个)
- 然后,最后一个继承的类通过调用其destroctor:~Deserived(){}被销毁(即类派生)。它继承了一个类,即“class base”,因此其destroctor被称为:~base(){}
- 最后,通过调用其析构函数:~base(){}来销毁由“class-derived 2”继承的第一个类(即class-base)
- 这里,销毁从“类派生2”开始(因此,它的析构函数被称为第一个)
- 然后,最后一个继承的类通过调用其destroctor:~Deserived(){}被销毁(即类派生)。它继承了一个类,即“class base”,因此其destroctor被称为:~base(){}
- 最后,通过调用其析构函数:~base(){}来销毁由“class-derived 2”继承的第一个类(即class-base)