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调用析构函数
可以看到,函数中析构函数的调用与类的声明顺序相反的