本文共 1384 字,大约阅读时间需要 4 分钟。
在使用new创建对象时,主要完成四项工作:
1 构造父类成员对象 2 构造子类成员对象 3 调用父类构造函数 4 调用子类构造函数 这四项工作的时间顺序是怎样的呢? 原则是:先父类后子类,先成员后函数 一级继承 例如: class X{ public: X(){cout<<"X";} }; class A{ public: X x1; A(){cout<<"A";} }; class B: public A{ public: X x2; B(){cout<<"B";} }; int main(){ B b; } 构造对象B时,根据第1个原则:先父类后子类,先构造A(1),然后构造B(2)。 构造A(1): 然后根据第2个原则,先成员后函数,先构造A的成员x1,即先调用X构造函数,然后再调用A构造函数 构造B(2): 根据第2个原则,先成员后函数,先构造B的成员x2,即先调用X构造函数,然后再调用B构造函数 因此输出为: XAXB即先后顺序为:1,父类成员 2,父类构造函数 3,子类成员 4,子类构造函数
多级继承 在一级继承中这个比较容易分析,在多级继承中就会复杂些,但坚持这两个原则,细心分析也不会出问题的。 #include <iostream> #include <fstream> #include <cstring> using namespace std; class X{ public: X(){cout<<"X";} }; class Y{ public: Y(){cout<<"Y";} }; class A{ public: A(){cout<<"A";} ~A(){cout<<"~A";} }; class B: public A{ public: Y x; A a; Y y; B(){cout<<"B";} ~B(){cout<<"~B";} }; class C: public B{ protected: X x; B b; A a; X y; public: C(){cout<<"C";} ~C(){cout<<"~C";} }; int main(){ C *c = new C(); delete c; } 这个程序的输出就比较复杂: AYAYBXAYAYBAXC~C~A~B~A~A~B~A~A 开始分析: 先父类后子类,所以先构造B(1),然后构造C(2) 构造B(1)的过程如下: 也是先构造A(1.1),然后构造B(1.2) 构造A(1.1)的过程如下: 调用A的构造函数,输出A(第一个输出字符) 构造B(1.2)的过程如下: 先成员(1.2.1)后构造(1.2.2), 成员(1.2.1)的过程如下: B的成员有Y,A,Y,所以构造Y,A,Y,输出YAY(第二到四个字符) 构造(1.2.2)的过程如下: B的构造函数,输出B(第五个字符) 所以构造B一共会输出YAYB四个字符 构造C(2)的过程如下: 先成员(2.1)后构造(2.2) 成员(2.1)的过程如下: C的成员有XBAX 所以构造X,输出X(第六个字符) 构造B输出AYAYB(第七到十一个字符) 构造A输出A(第十二个字符) 构造X输出X(第十三个字符) 构造(2.2) 输出C(第十四个字符) 最后按照完全相反的顺序调用析构函数转载地址:http://ogmji.baihongyu.com/