您的位置:首页 > 其它

父类、构造函数、成员对象的调用时机

2014-06-27 20:57 211 查看
http://hankjin.blog.163.com/blog/static/33731937201010633157934/

在使用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

多级继承

在一级继承中这个比较容易分析,在多级继承中就会复杂些,但坚持这两个原则,细心分析也不会出问题的。

#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(第十四个字符)

最后按照完全相反的顺序调用析构函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐