您的位置:首页 > 其它

多重继承构造函数执行顺序

2012-07-25 15:52 197 查看
class 派生类名:继承方式1 基类名1,继承方式2 基类名2,....
{
//派生类成员定义
};
对每个基类可以用不同的继承方式,默认继承方式为private。
在多重继承中,派生类的构造函数与单继承下派生类构造函数相似,它必须负责该派生类所有基类构造函数以及对象成员(如果有的话)构造函数的调用。同时,派生类的参数必须包含完成所有基类、对象成员以及派生类中新增数据成员初始化所需的参数。派生类构造函数执行顺序如下:
(1)所有基类的构造函数,多个基类构造函数的执行顺序取决于定义派生类时所指定的顺序,与派生类构造函数中所定义的成员初始化列表的参数顺序无关;
(2)对象成员的构造函数;
(3)派生类本省的构造函数。

加上虚基类后,它的初始化在语法上与一般多继承的初始化是相同的,但在调用构造函数的顺序上有点差别。
(1)先调用虚基类构造函数,然后调用非虚基类的构造函数。
(2)当同一层有多个虚基类,按照他们的声明顺序调用它们的构造函数;
(3)当虚基类是由非虚基类派生时,则先调用基类构造函数,再调用派生类构造函数。
例1:
class X:public Y,virtual public Z

{

}

X one;

将产生如下调用顺序:

Z()

Y()

X()

这里Z是X的虚基类,故先调用Z的构造函数,再调用Y的构造函数,最后才调用派生类X自己的构造函数.

例2:
class base1

{

....

};

class base2

{

....

};

class level1:public base2,virtual public base1

{

....

};

class level2:public base2,virtual public base1

{

....

};

class toplevel1:public level1,virtual public level2

{

....

};

toplevel1 view;

当产生对象view时,将产生如下调用次序:
base1()
base2()
level2()
base2()
level1()
toplevel1()
toplevel1有两个基类:一个是虚基类level2,l另一个是非虚基类level1.根据规定:应先执行levevl2的构造函数;level2也有两个基类,一个实虚基类base1,另一个是非虚基类base2,应先执行base1的构造函数,再执行base2的构造函数,最后执行level2的构造函数。toplevel1然后执行level1的构造函数,而level1又有两个基类,base1是虚基类,无需再执行其构造函数,base2是非虚基类,因此要先执行base2的构造函数,然后执行level1的构造函数。最后执行toplevel1的构造函数。上例中,对于toplevel1的对象而言,base1是level1的虚基类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐