您的位置:首页 > 其它

派生类构造函数举例(多继承、含有内嵌对象)

2013-04-07 10:01 816 查看
#include <iostream>

using namespace std;

class B1
{
public:
    B1(int i){cout<<"coustructing B1 "<<i<<endl;}
};
class B2
{
public:
    B2(int j){cout<<"coustructing B2 "<<j<<endl;}
};
class B3
{
public:
    B3(){cout<<"coustructing 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;
};
int main()
{
    C obj(1,2,3,4);
    return 0;
}


这是一个具有一般性特征的例子,有三个基类B1,B2和B3,其中B3只有一个默认的构造函数,其余两个基类的成员只是一个带有参数的构造函数。类C由这三个基类经过公有派生而来。派生类新增加了三个私有对象成员,分别是B1、B2和B3类的对象。

分析:

因为基类及内嵌对象成员都具有非默认形式的构造函数,所以派生类中需要声明一个非默认形式(即带参数)的构造函数。这个派生类构造函数的主要功能就是初始化基类及内嵌对象成员,派生类的构造函数定义为:

C(int a,int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b){}

构造函数的参数表中给出了基类及内嵌成员对象所需的全部参数,在冒号之后,分别列出了各个基类及内嵌对象名和各自的参数。

这里有几个问题要注意:

首先,这里并没有列出全部基类和成员对象,由于B3类只有默认构造函数,不需要给它传递参数,因此基类B3以及B3类成员对象memberB3就不必列出。

其次,基类名和成员对象名的顺序是随意的。

这个派生类构造函数的函数体为空,可见实际上只是起到了传递参数调用基类及内嵌对象构造函数的作用。

程序的主函数只是声明了一个派生类C的对象obj,生成对象obj时调用了派生类的构造函数。我们来考虑C类构造函数的执行情况,它应该是先调用基类的构造函数,然后调用内嵌对象的构造函数基类构造函数的调用顺序是按照派生类定义时的顺序,因此应该是先B2,再B1,再B3,而内嵌对象的构造函数调用顺序应该是按照成员在类中声明的顺序,应该是先B1,再B2,再B3,程序运行的结果也完全证实了这种分析。

程序的运行结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: