首先,我们需要了解一下派生类构造函数执行的一般次序。
派生类构造函数执行的一般次序:
①调用基类构造函数,调用顺序按照他们被继承时的声明的顺序(从左往右);
②调用内嵌成员对象的构造函数,调用顺序按照他们在类中的声明的顺序;
③派生类的构造函数体重的内容
举例说明:
这是一个具有一般性特征的例子,有三个基类B1、B2和B3,其中B3只有一个默认的构造函数,其余两个基类的成员只是一个带有参数的构造函数。类C由这三个基类经过公有派生而来。派生类新增加了三个私有对象成员,分别是B1、B2和B3类的对象。
#include <iostream>
using namespace std;
class B1{
public:
B1( int i){cout<<"constructing B1 " <<i<<endl;}
};
class B2{
public:
B2( int j){cout<<"constructing B2 " <<j<<endl;}
};
class B3{
public:
B3(){cout<< "constructing B3 * "<<endl;}
};
class C:public B2, public B1, public B3
{
public:
C( int a, int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b){}
private:
B1 memberB1;
B2 memberB2;
B3 memberB3;
};
void main()
{
C obj(1,2,3,4);
}
结果:
constructing B2 2
constructing B1 1
constructing B3 *
constructing B1 3
constructing B2 4
constructing B3 *
constructing B1 1
constructing B3 *
constructing B1 3
constructing B2 4
constructing B3 *
①先根据
class
C:
public
B2,
public
B1,
public
B3
依次调用函数;
②再根据B1 memberB1;B2 memberB2; B3 memberB3;
调用函数;
③在构造函数时
C(
int
a,
int
b,
int
c,
int
d):B1(a),memberB2(d),memberB1(c)
,B2(b)
{}
,B1和memberB1要同时调用,B2和memberB2也要同时调用,否则会报错
例子1-2
#include <iostream>
using namespace std;
class B1{
public:
B1( int i){cout<<"constructing B1 " <<i<<endl;}
};
class B2{
public:
B2( int j){cout<<"constructing B2 " <<j<<endl;}
};
class B3{
public:
B3( int j){cout<<"constructing B3 " <<j<<endl;} //增加了形参,于是出现数字了
};
class C:public B2, public B1, public B3
{
public:
C( int a, int b, int c, int d, int e, int f):B1(a),memberB2(d),memberB1(c),B2(b),B3(e),memberB3(f){}
private:
B1 memberB1;
B3 memberB3;
B2 memberB2;//调换了顺序,于是结果变了!
};
void main()
{
C obj(1,2,3,4,5,6);
}
结果:
constructing B2 2
constructing B1 1
constructing B3 5
constructing B1 3
constructing B3 6
constructing B2 4
constructing B1 1
constructing B3 5
constructing B1 3
constructing B3 6
constructing B2 4