为了账号安全,请及时绑定邮箱和手机立即绑定

为什么对ChildLabourer初始化列表不能写成这样?ChildLabourer(string name, int age):m_strName(name),m_iAge(age)

既然都公有继承了父类,那么子类就应该可以对父类数据成员m_strName和m_iAge进行初始化列表呀,为什么还得用父类的构造函数进行初始化列表 ChildLabourer(string name, int age):Worker(name),Children(age) ???

代码如下:

class ChildLabourer : public Worker,public Children
{
public:
ChildLabourer(string name, int age):m_strName(name),m_iAge(age)
{
cout << "ChildLabourer" << endl;
}

~ChildLabourer()
{
cout << "~ChildLabourer" << endl;
}
};


正在回答

2 回答

编译器给出的提示是ChildLabourer类没有m_strName和m_iAge成员变量。

推测是子类的初始化列表先于父类的构造函数执行,否则无法将参数传递给父类。因此在执行ChildLabourer的初始化列表时,父类(Worker, Children)的构造方法尚未执行,当然成员变量(m_strName, m_iAge)也就不存在,因此不能在子类的初始化列表中初始化父类的成员变量。

0 回复 有任何疑惑可以回复我~

回答的不错,我觉着还有点需要补充。实例化子类对象时,需要先实例化父类的对象,因为父类没有默认构造函数,所以必须得给父类构造函数传参,后面就是楼主所说的了:初始化列表是早于构造函数运行的,早于父类子类的构造函数。如果父类有默认构造函数的话,就不需要传参了。如果要传参,只能先实例化父类对象,也就是在初始化列表中一步完成实例化,后面也就用再实例化了。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之继承篇
  • 参与学习       75202    人
  • 解答问题       249    个

继承,C++面向对象三大特征之一,通过编码实践方式讲解到操作层面

进入课程

为什么对ChildLabourer初始化列表不能写成这样?ChildLabourer(string name, int age):m_strName(name),m_iAge(age)

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信