有子对象的派生类的构造函数
2009-06-17 09:51
239 查看
类的数据成员中还可以包含类对象,如可以在声明一个类时包含这样的数据成员:
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 ) //基类构造函数,与例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(); //输出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)
在上面的构造函数中有6个形参,前两个作为基类构造函数的参数,第3、第4个作为子对象构造函数的参数,第5、第6个是用作派生类数据成员初始化的。
归纳起来,定义派生类构造函数的一般形式为
派生类构造函数名(总参数表列): 基类构造函数名(参数表列),子对象名(参数表列)
{派生类中新增数成员据成员初始化语句}
执行派生类构造函数的顺序是:
① 调用基类构造函数,对基类数据成员初始化;
② 调用子对象构造函数,对子对象数据成员初始化;
③ 再执行派生类构造函数本身,对派生类数据成员初始化。
④ 派生类构造函数的总参数表列中的参数,应当包括基类构造函数和子对象的参数表列中的参数。基类构造函数和子对象的次序可以是任意的,如上面的派生类构造函数首部可以写成
Student1(int n, string nam,int n1, string nam1,int a, string ad):
monitor(n1,nam1),Student(n,nam)
⑤ 编译系统是根据相同的参数名(而不是根据参数的顺序)来确立它们的传递关系的。但是习惯上一般先写基类构造函数。
⑥ 如果有多个子对象,派生类构造函数的写法依此类推,应列出每一个子对象名及其参数表列。
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 ) //基类构造函数,与例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(); //输出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)
在上面的构造函数中有6个形参,前两个作为基类构造函数的参数,第3、第4个作为子对象构造函数的参数,第5、第6个是用作派生类数据成员初始化的。
归纳起来,定义派生类构造函数的一般形式为
派生类构造函数名(总参数表列): 基类构造函数名(参数表列),子对象名(参数表列)
{派生类中新增数成员据成员初始化语句}
执行派生类构造函数的顺序是:
① 调用基类构造函数,对基类数据成员初始化;
② 调用子对象构造函数,对子对象数据成员初始化;
③ 再执行派生类构造函数本身,对派生类数据成员初始化。
④ 派生类构造函数的总参数表列中的参数,应当包括基类构造函数和子对象的参数表列中的参数。基类构造函数和子对象的次序可以是任意的,如上面的派生类构造函数首部可以写成
Student1(int n, string nam,int n1, string nam1,int a, string ad):
monitor(n1,nam1),Student(n,nam)
⑤ 编译系统是根据相同的参数名(而不是根据参数的顺序)来确立它们的传递关系的。但是习惯上一般先写基类构造函数。
⑥ 如果有多个子对象,派生类构造函数的写法依此类推,应列出每一个子对象名及其参数表列。
相关文章推荐
- 派生类的构造函数、对象的初始化
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- 构造函数的执行顺序---派生类构造函数 and 父类构造函数 and 成员对象构造函数
- 【C++继承与派生之二】有子对象的派生类的构造函数
- 对于派生类的构造函数,在定义对象时构造函数的执行顺序
- 派生类的构造函数及其对象的初始化
- C++有子对象的派生类的构造函数
- C++中建立派生类对象时构造函数的调用顺序
- 派生类构造函数举例(多继承、含有内嵌对象)
- 例4.9 含有多个对象成员的派生类构造函数的执行顺序
- C++派生类对象构造函数初始化顺序
- 有子对象的派生类的构造函数
- 【C++继承与派生之二】有子对象的派生类的构造函数
- 面向对象的程序设计-学习笔记-23-派生类的构造函数和析构函数
- 派生类的构造函数及其对象的初始化
- 在派生类中使用对象成员时,构造函数和析构函数的作用过程。
- C++有子对象的派生类的构造函数
- 派生类构造函数举例(多继承、含有内嵌对象)
- [C++]派生类构造函数举例(多继承、含有内嵌对象)
- C++类和对象知识点整理五----派生类的构造函数和析构函数