首页 > 代码库 > 继承构造函数的执行顺序

继承构造函数的执行顺序

转自:http://blog.csdn.net/daheiantian/article/details/6438782

Code:

#include <iostream>using namespace std;class A {public:A() {cout<<"int A::A()"<<endl;}A(A &a) {cout<<"int A::A(A &a)"<<endl;}A& operator=(A& a) {cout<<"int A::operator=(A &a)"<<endl;return a;}virtual ~A() {cout<<"int A::~A()"<<endl;}};class M :public A {public:M() {cout<<"int M::M()"<<endl;}M(M &a) {cout<<"int M::M(M &a)"<<endl;}M& operator=(M& m) {cout<<"int M::operator=(M &a)"<<endl;return m;}virtual ~M() {cout<<"int M::~M()"<<endl;}};class B:virtual public M {public:B() {cout<<"int B::B()"<<endl;}B(B &a) {cout<<"int B::B(B &a)"<<endl;}B& operator=(B& b) {cout<<"int B::operator=(B &a)"<<endl;return b;}virtual ~B() {cout<<"int B::~B()"<<endl;}};class N :public A {public:N() {cout<<"int N::N()"<<endl;}N(N &a) {cout<<"int N::N(N &a)"<<endl;}N& operator=(N& n) {cout<<"int N::operator=(N &a)"<<endl;return n;}virtual ~N() {cout<<"int N::~N()"<<endl;}};class C:virtual public N {public:C() {cout<<"int C::C()"<<endl;}C(C &a) {cout<<"int C::C(C &a)"<<endl;}C& operator=(C& c) {cout<<"int C::operator=(C &a)"<<endl;return c;}virtual ~C() {cout<<"int C::~C()"<<endl;}};class E:virtual public M{public:E() {cout<<"int E::E()"<<endl;}E(E &a) {cout<<"int E::E(E &a)"<<endl;}E& operator=(E& e) {cout<<"int E::operator=(E &a)"<<endl;return e;}virtual ~E() {cout<<"int E::~E()"<<endl;}};class D:public B, public C, public E {public:D() {cout<<"int D::D()"<<endl;}D(D &a) {cout<<"int D::D(D &a)"<<endl;}D& operator=(D& d) {cout<<"int D::operator=(D &a)"<<endl;return d;}virtual ~D() {cout<<"int D::~D()"<<endl;}};int main(int argc, char **argv) {cout<<"-------构造函数-------"<<endl;D d;cout<<"-------复制构造函数-------"<<endl;D d1(d);cout<<"-------赋值操作符-------"<<endl;d = d1;cout<<"-------析构函数-------"<<endl;return 0;}

 

Result:

-------构造函数-------int A::A()int M::M()//构造虚基类M时,要先构造其父类Aint A::A()int N::N()//和M一样,构造虚基类N时,也要先构造其父类Aint B::B()//构造完虚基类,开始构造直接父类,按照声明顺序为B、C、Eint C::C()int E::E()int D::D()//最后构造自己-------复制构造函数-------int A::A()int M::M()int A::A()int N::N()int B::B()int C::C()int E::E()int D::D(D &a)//因为D中定义了复制构造函数,并且没有显式调用父类的构造函数,所以所有的“虚基类”和“直接父类”都调用默认构造函数-------赋值操作符-------int D::operator=(D &a) //因为显式调用了赋值操作符,那么就只调用自己的代码,不会隐式调用其它的函数-------析构函数-------int D::~D()int E::~E()int C::~C()int B::~B()int N::~N()int A::~A()int M::~M()int A::~A()//因为main函数中定义了两个D对象,所以main函数结束时要进行析构两个D对象。析构的顺序与 构造函数相反。int D::~D()int E::~E()int C::~C()int B::~B()int N::~N()int A::~A()int M::~M()int A::~A()Press any key to continue.