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

本文介绍了在C++中如何使用派生类构造函数来初始化基类、子对象及派生类自身的数据成员,并通过一个具体示例展示了构造函数的初始化顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的数据成员中还可以包含类对象,如可以在声明一个类时包含这样的数据成员:
   Student s1;// Student是已声明的类名,s1是Student类的对象
这时,s1就是类对象中的内嵌对象,称为子对象(subobject),即对象中的对象。

通过例子来说明问题。
例: 包含子对象的派生类的构造函数。为了简化程序以易于阅读,这里设基类Student的数据成员只有两个,即num和name。
#include <iostream>
#include <string>
using namespace std;
class Student//声明基类
{
public : //公用部分
   Student(int n, string nam ) :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(); //输出num和name
      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),age(a),addr(ad)
在上面的构造函数中有6个形参,前两个作为基类构造函数的参数,第3、第4个作为子对象构造函数的参数,第5、第6个是用作派生类数据成员初始化的。

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

   派生类构造函数名(总参数表列):基类构造函数名(参数表列),子对象名(参数表列){派生类中新增数成员据成员初始化语句}

或者

    派生类构造函数名(总参数表列):基类构造函数名(参数表列),子对象名(参数表列),内置类型成员初始列表{}

执行派生类构造函数的顺序是:
  1. 调用基类构造函数,对基类数据成员初始化;
  2. 调用子对象构造函数,对子对象数据成员初始化;
  3. 再执行派生类构造函数本身,对派生类数据成员初始化。

习惯上一般先写基类构造函数。如果有多个子对象,派生类构造函数的写法依此类推,应列出每一个子对象名及其参数表列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值