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

来源:互联网 发布:mac 磁盘格式 编辑:程序博客网 时间:2024/04/27 15:18

   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的虚基类。

原创粉丝点击