子类的构造函数
- 子类可以有自己的构造函数
- 子类没有构造函数,默认系统会调用父类的构造函数
- 子类有自己的构造函数,系统会先运行父类的构造函数,随后运行子类的构造函数,对子类对象进行覆盖和拓展
- 即不论子类有没有构造函数,创建子类对象时,父类构造函数都将被调用
class student: //创建student对象,这个将成为父类
{
public:
/*两个成员函数名称相同,但形参类型不同,系统会根据传入参数类型来分别修改对象的年龄和名字,这种现象称为重载*/
bool set(int a); //普通成员函数,修改对象年龄
bool set(string a); //普通成员函数,修改对象名字
/*常成员函数,即一个方法只读取属性,而不修改属性,就是常成员函数,常成员函数使用const修饰,加const只是安全考虑,防止意外修改数据*/
bool read() const; //读取对象属性,返回值为bool类型
/*构造函数,本质上是将对象初始化,构造函数的名字必须和类的名字一样*/
/*不带参数的构造函数,自动初始化对象*/
student();
/*带参数的构造函数,动态初始化对象*/
student(int a, string b);
private:
int age;
string name;
}
bool student :: set(int a)
{
age = a;
return true;
}
bool student :: set(string a)
{
name = a;
return true;
}
bool student :: read() const
{
cout<< age;
cout<< name;
return true;
}
student :: student()
{
age =20;
name = "张三";
}
student :: student(int a, string b)
{
age = a;
name = b;
}
/*研究生不带参数构造*/
class postgraduate : public student //定义研究生类,表示从student类派生而来
{
public: //研究生公有成员
string research; //这行新增定义了一个公开的属性research,字符串,研究生的方向
postgraduate(); //研究生的无参数构造函数的声明
postgraduate(int a, string b, string c); //研究生的有参数的构造函数的声明,参数为年龄,姓名和研究方向
}
postgraudate :: postgraduate()
{
research = "asic design"; //对研究生的research属性赋值为asic design,注意没有age和name
}
//下面是主函数
postgraduate bb ; //创建研究生对象bb,调用无参数构造函数
- 创建子类bb对象后,系统首先会运行父类student构造函数,对age和name赋值,随后运行子类postgraduate构造函数,对bb对象进行拓展,增加research内容
- 换句话说,子类是不能继承父类的构造函数的,只能调用父类构造函数
/*带参数的子类构造函数*/
postgraduate :: postgraduate(int a, string b, string c) :student(a,b) //带参数构造函数定义
{
research = c;
}
//下面是主函数
postgraduate bb(25,"李四","ASIC design") ; //创建研究生对象bb,传入有参数的构造函数
- 程序会先调用父类student构造函数,把25和李四两个值传入父类student带参数的构造函数
- 随后把参数c=asic design传给bb自己的research属性。这样实现了对研究生对象的全动态的初始化赋值。