基类和派生类析构函数调用顺序的输出例子

来源:互联网 发布:js是什么文件 编辑:程序博客网 时间:2024/06/11 15:38
class A  {  public:      A()  {     }      ~A() {    cout<<"~A"<<endl;   }  };    class B:public A  {      public:          B(A &a):_a(a)          {                      }          ~B()          {              cout<<"~B"<<endl;          }      private:          A _a;      };        int main(void)   {          A a;       //很简单,定义a的时候调用了一次构造函数          B b(a); }

输出为:

~B
~A
~A
~A

想知道其调用顺序是怎样的,可以类中添加成员变量name,在析构函数中打印出来,将代码改为下面的:

#include <iostream>#include <string>using namespace std;class A{public:A(string n = "default"):name(n)  {     }~A() { cout << "~A:" << name << endl; }private:string name;};class B :public A{public:B(A &a) :_a(a){}~B(){cout << "~B" << endl;}private:A _a;};int main(void){A a("a");       //很简单,定义a的时候调用了一次构造函数  B b(a);}

输出为:


第一行是调用B的析构函数

第二行是因为派生类中包含类A,要把a释放,调用a的析构函数

第三行是调用基类的析构函数

第四行是因为A a调用析构函数

可以看到,函数中析构函数的调用与类的声明顺序相反的

0 0
原创粉丝点击