6.2 有子对象的派生类的构造函数
经过前面的学习,我们了解了C++的继承。在派生类的构造函数中,需要对基类的构造函数进行调用,初始化从基类继承过来的数据。
那么,如果在派生类的成员变量中定义了C++类对象,那么,在派生类的构造函数中,怎么样初始化C++类对象的成员变量?例如:
//定义一个类,继承自student类;
class student_new: private student
{
public:
char name[32]; //姓名
char addr[32]; //家庭地址
student my_stud;
public:
student_new(int n, char* pname, char s, int a, char* paddr);
...
};
在定义student_new派生类的时候,定义类的成员变量,其中my_stud成员变量是一个student类对象。
所以,一个类的成员变量,可以是其他类的对象。此时,my_stud就是类对象中的内嵌对象,称为:子对象(subobject),即对象中的对象。
我们定义一个基类student,然后,派生类student_new从基类student派生而来。同时, student_new中成员变量中有一个student类对象。 在建立student_new对象的时候,对他的成员变量进行初始化。那么,怎么样对student类型的子对象初始化呢?
子对象的初始化,应该是在建立派生类时,通过派生类的构造函数来实现的。
派生类构造函数的任务应该包括3 个部分:
(1) 对基类成员变量初始化。
(2) 对子对象成员变量初始化。
(3) 对派生类成员变量初始化。
那么,定义派生类构造函数的一般形式为:
派生类构造函数名(总参数列表):基类构造函数名(参数列表),子对象名(参数列表)
{ ... }
所以,执行派生类构造函数的顺序是:
(1) 调用基类构造函数,对基类成员变量初始化。
(2) 调用子对象构造函数,对子对象成员变量初始化。
(3) 再执行派生类构造函数本身,对派生类成员变量初始化。
所以,我们可以编写一个例子来验证该知识点,测试代码如下:
程序运行结果如下:
可以看到,定义了基类student和派生类student_new,在student_new的成员变量中,定义了一个student类型的子对象my_stud。
所以,在student_new的构造函数中,需要对子对象my_stud进行初始化。所以,派生类student_new的构造函数如下:
student_new::student_new(char* pn, char* pa, long long n):
student(pn, pa),my_stud("abc", "china")
{
number = n;
}
可以看到,定义派生类student_new的构造函数,同时,调用基类student的构造函数。然后,对子对象my_stud进行初始化。
对my_stud对象初始化的时候,就是调用该类对象的构造函数,给对象传递初始化的参数。完成对象的初始化。
如果有多个子对象,派生类构造函数的写法依此类推,应该列出每一个子对象名及其参数列表。