多重继承构造函数执行顺序
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的虚基类。
{
//派生类成员定义
};
对每个基类可以用不同的继承方式,默认继承方式为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的虚基类。
相关文章推荐
- 多重继承-构造函数与析构函数执行顺序
- 继承中,父类与子类都有静态代码块和构造函数的时执行顺序
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容 【转】 参考度4.6星
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
- JAVA继承关系中静态代码块、非静态代码块,构造函数的执行顺序
- Java对象的构造过程---子类继承父类时(非)静态块及构造函数等的执行顺序
- 关于继承构造函数执行顺序、override及new如何执行的学习笔记
- 在继承条件下构造函数、代码块、静态代码块执行顺序
- C#类的继承中,构造函数的执行顺序
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 继承下构造函数的执行顺序
- 不包含继承时类中的静态块、静态方法、非静态方法、构造函数的执行顺序?
- 多继承、虚继承构造函数执行顺序
- C++在单继承、多继承、虚继承时,复制构造函数。赋值构造函数、析构函数的执行顺序
- C++继承时构造函数执行顺序
- 【java】构造函数的继承执行顺序
- Java组合与继承生成的类中构造函数的执行顺序
- 继承下构造函数的执行顺序