子类的构造函数

  • 子类可以有自己的构造函数
    • 子类没有构造函数,默认系统会调用父类的构造函数
    • 子类有自己的构造函数,系统会先运行父类的构造函数,随后运行子类的构造函数,对子类对象进行覆盖和拓展
    • 即不论子类有没有构造函数,创建子类对象时,父类构造函数都将被调用
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属性。这样实现了对研究生对象的全动态的初始化赋值。
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/wangxiaobin/p/17556570.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程