一个很BT的程序,但是有助于搞清楚构造和析构的基本概念,来,做做看,写出这个程序的结果来!
明天公布答案。
#include <iostream>
class B1
{
public:
B1(int i)
{
std::cout<<"constructing B1 "<<i<<std::endl;
}
~B1()
{
std::cout<<"destructing B1"<<std::endl;
}
};
class B2
{
public:
B2(int j)
{
std::cout<<"constructing B2 "<<j<<std::endl;
}
~B2()
{
std::cout<<"destructing B2"<<std::endl;
}
};
class B3
{
public:
B3()
{
std::cout<<"constructing B3 *"<<std::endl;
}
~B3()
{
std::cout<<"destructing B3"<<std::endl;
}
};
class C:public B2,public B1,public B3
{
public:
C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){};
private:
B1 memberB1;
B2 memberB2;
B3 memberB3;
};
int main()
{
C obj(1,2,3,4);
return 0;
}
1、如果是继承的关系,则和被继承时生命的顺序有关,跟构造函数无关。在构造时会首先构造根基类,之后一次提高,直到最后的派生类。
2、调用每个类的构造函数时,会按照成员变量声明的顺序构造。
3、最后的派生类的构造函数体的内容是最后调用的,紧挨析构之前。
4、析构的顺序完全有构造相反,而且唯一。
先按照继承的顺序构造基类,也就是按照 B2,B1,B3 的顺序,然后再按照数据成员声明的顺序构造数据成员,也就是 memberB1,memberB2,memberB3 的顺序。
析构顺序与此相反。