有子对象的派生类的构造函数

来源:互联网 发布:html5 app引导页源码 编辑:程序博客网 时间:2024/04/27 14:00

类的数据成员中还可以包含类对象,如可以在声明一个类时包含这样的数据成员:

Student s1;// Student是已声明的类名,s1Student类的对象

这时,s1就是类对象中的内嵌对象,称为子对象(subobject),即对象中的对象。

 

通过例子来说明问题。

例:包含子对象的派生类的构造函数。

为了简化程序以易于阅读,这里设基类Student的数据成员只有两个,即numname

#include <iostream>

#include <string>

using namespace std;

class Student//声明基类

 {public:                                  //公用部分

Student(int n, string nam )             //基类构造函数,与例11.5相同

    {num=n;

     name=nam;

    }

   void display( )                           //成员函数,输出基类数据成员

    {cout<<num:<<num<<endl<<name:<<name<<endl;}

protected:                                //保护部分

int num;

    string name;

};

class Student1: public Student              //声明公用派生类Student1

{public:

   Student1(int n, string nam,int n1, string nam1,int a, string ad)

      :Student(n,nam),monitor(n1,nam1)                 //派生类构造函数

    {age=a;                        

     addr=ad;

    }

   void show( )

    {cout<<This student is:<<endl;

     display();                               //输出numname

     cout<<age: <<age<<endl;                //输出age

     cout<<address: <<addr<<endl<<endl;     //输出addr

    }

       void show_monitor( )                        //成员函数,输出子对象

    {cout<<endl<<Class monitor is:<<endl;

     monitor.display( );                       //调用基类成员函数

  }

   private:                                   //派生类的私有数据

    Student monitor;                          //定义子对象(班长)

    int age;

    string addr;

  };

int main( )

{Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijing Road,Shanghai);

   stud1.show( );                       //输出学生的数据

   stud1.show_monitor();                //输出子对象的数据

return 0;

}

运行时的输出如下:

This student is:

num: 10010

name: Wang-li

age: 19

address:115 Beijing Road,Shanghai

Class monitor is:

num:10001

name:Li-sun

 

派生类构造函数的任务应该包括3个部分:

1 对基类数据成员初始化;

2 对子对象数据成员初始化;

3 对派生类数据成员初始化。

程序中派生类构造函数首部如下:

Student1(int n, string nam,int n1, string nam1,int a, string ad):

Student(n,nam),monitor(n1,nam1)

 

在上面的构造函数中有6个形参,前两个作为基类构造函数的参数,第3、第4个作为子对象构造函数的参数,第5、第6个是用作派生类数据成员初始化的。

归纳起来,定义派生类构造函数的一般形式为

派生类构造函数名(总参数表列): 基类构造函数名(参数表列),子对象名(参数表列)

  {派生类中新增数成员据成员初始化语句}

执行派生类构造函数的顺序是:

① 调用基类构造函数,对基类数据成员初始化;

② 调用子对象构造函数,对子对象数据成员初始化;

③ 再执行派生类构造函数本身,对派生类数据成员初始化。

④ 派生类构造函数的总参数表列中的参数,应当包括基类构造函数和子对象的参数表列中的参数。基类构造函数和子对象的次序可以是任意的,如上面的派生类构造函数首部可以写成

Student1(int n, string nam,int n1, string nam1,int a, string ad):

monitor(n1,nam1),Student(n,nam)

⑤ 编译系统是根据相同的参数名(而不是根据参数的顺序)来确立它们的传递关系的。但是习惯上一般先写基类构造函数。

⑥ 如果有多个子对象,派生类构造函数的写法依此类推,应列出每一个子对象名及其参数表列。

 

原创粉丝点击