C++实验05(03)虚函数与虚基类

题目描述
在习题4-3的基础上,编程实现:本题的类间关系如图5-1所示(学习通中的实验5文档中)。
定义一个人员类Person,数据成员包括编号、姓名、性别、家庭住址、联系电话。性别用char型实现,’f’表示女性,’m’表示男性,其它用string类型。成员函数包括:(1)构造函数;(2)输出函数print(),输出一个人员的全部描述信息,并定义为虚函数。
定义一个学生类Student,为Person类的公有派生类。新增的数据成员包括数学、物理、英语、程序设计四门课成绩,各门课成绩为整型。新增的成员函数包括:(1)设置数学、物理、外语、程序设计四门课成绩,函数原型为void setScore(char tag, int score);当tag的值分别为’m’、’p’、’e’和’c’时,分别设置数学、物理、英语、程序设计四门课成绩。1)构造函数;(2) 输出函数print(),输出一个学生的全部信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。
定义一个教师类Teacher,为Person类的公有派生类。新增的数据成员包括:职称、工资(职称为string类型,工资为double型)。新增的成员函数包括:(1) 构造函数;(2) 输出函数print(),输出一个教师的全部描述信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。
由Student类和Teacher类公有派生子类TA(助教博士生)类,添加数据成员:专业(string类型),添加构造函数、输出函数(输出一个TA对象的全部信息)。
定义一个普通函数fun(),形参为Person类的指针,利用C++的多态性,调用虚函数实现输出各对象的信息。
主函数中定义分别Student、Teacher、TA类的对象各一个,其各数据成员的初始值由键盘输入,调用fun()输出Student对象的全部信息;修改Student对象的成绩,数据由键盘输入,再调用fun()输出Student对象的全部信息。调用fun()输出Teacher、TA类的对象的全部信息。
注意虚基类的使用。
输入描述
四行
学生类对象的全部初值
成绩修改的代号和成绩
教师类对象的全部初值
TA类对象的全部初值
输出描述
学生对象的全部信息
学生对象修改成绩后的全部信息
教师对象的全部信息
TA对象的全部信息
输入样例
1001 刘玄德 m 河北涿州 12345678999 87 90 85 88
m 92
2031001 诸葛亮 m 徐州琅琊 13344556677 副教授 5500
3045866 赵子龙 m 常山真定 12345678988 87 90 85 88 讲师 3500 计算机科技与技术
输出样例
学生信息:
编 号:1001
姓 名:刘玄德
性 别:m
家庭住址:河北涿州
联系电话:12345678999
数 学:87
物 理:90
英 语:85
程序设计:88

编 号:1001
姓 名:刘玄德
性 别:m
家庭住址:河北涿州
联系电话:12345678999
数 学:92
物 理:90
英 语:85
程序设计:88

教师信息:
编 号:2031001
姓 名:诸葛亮
性 别:m
家庭住址:徐州琅琊
联系电话:13344556677
职 称:副教授
工 资:5500

TA信息:
编 号:3045866
姓 名:赵子龙
性 别:m
家庭住址:常山真定
联系电话:12345678988
数 学:87
物 理:90
英 语:85
程序设计:88
职 称:讲师
工 资:3500
专 业:计算机科技与技术(中文冒号)

#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
	Person(string a, string b, char c, string d, string e);
	void set_number(string a);
	void set_name(string b);
	void set_sex(char c);
	void set_address(string d);
	void set_phone_number(string e);
	virtual void print()
	{
		cout << "编    号:" << number << endl;
		cout << "姓    名:" << name << endl;
		cout << "性    别:" << sex << endl;
		cout << "家庭住址:" << address << endl;
		cout << "联系电话:" << phone_number << endl;
	}

private:
	string number;
	string name;
	char sex;
	string address;
	string phone_number;

};
Person::Person(string a, string b, char c, string d, string e)
{
	number = a;
	name = b;
	sex = c;
	address = d;
	phone_number = e;
}
void Person::set_number(string a)
{
	number = a;
}
void Person::set_name(string b)
{
	name = b;
}
void Person::set_sex(char c)
{
	sex = c;
}
void Person::set_address(string d)
{
	address = d;
}
void Person::set_phone_number(string e)
{
	phone_number = e;
}



class Student :virtual public Person
{
public:
	Student(string a, string b, char c, string d, string e, int f, int g, int h, int i);
	void setScore(char tag, int score);
	virtual void print()

	{
		Person::print();
		cout << "数    学:" << math << endl;
		cout << "物    理:" << physical << endl;
		cout << "英    语:" << english << endl;
		cout << "程序设计:" << c_lan << endl;
	}
	void cj()
	{
		cout << "数    学:" << math << endl;
		cout << "物    理:" << physical << endl;
		cout << "英    语:" << english << endl;
		cout << "程序设计:" << c_lan << endl;
	}
private:
	int math, physical, english, c_lan;
};
Student::Student(string a, string b, char c, string d, string e, int f, int g, int h, int i) :Person(a, b, c, d, e)
{
	math = f;
	physical = g;
	english = h;
	c_lan = i;
}
void Student::setScore(char tag, int score)
{

	switch (tag)
	{
	case 'm':math = score; break;
	case 'p':physical = score; break;
	case 'e':english = score; break;
	case 'c':c_lan = score; break;
	}
}



class Teacher :virtual public Person
{
public:
	Teacher(string a, string b, char c, string d, string e, string f, double g);
	void set_title(string f);
	void set_wages(double g);
	virtual void print();
	void cz()
	{
		cout << "职    称:" << title << endl;
		cout << "工    资:" << wages << endl;
	}
private:
	string title;
	double wages;
};
Teacher::Teacher(string a, string b, char c, string d, string e, string f, double g) :Person(a, b, c, d, e)
{
	title = f;
	wages = g;
}
void Teacher::set_title(string f)
{
	title = f;
}
void Teacher::set_wages(double g)
{
	wages = g;
}
void Teacher::print()
{
	Person::print();
	cout << "职    称:" << title << endl;
	cout << "工    资:" << wages << endl;

}
class Ta : virtual public Student, Teacher {
public:
	Ta(string a, string b, char c, string d, string e, int f, int g, int h, int i, string ch, double gz, string zh) :Student(a, b, c, d, e, f, g, h, i), Teacher(a, b, c, d, e, ch, gz), Person(a, b, c, d, e)
	{
		zhuan = zh;
	}

	virtual void print()
	{
		Person::print();
		Student::cj();
		Teacher::cz();

		cout << "专    业:" << zhuan << endl;

	}
private:
	string zhuan;





};

void fun(Person *a)
{
	a->print();
}

int main()
{
	string number_1;
	string name_1;
	char sex_1;
	string address_1;
	string phone_number_1;
	string number_2;
	string name_2;
	char sex_2;
	string address_2;
	string phone_number_2;
	int math, physical, english, c_lan;
	string number_3;
	string name_3;
	char sex_3;
	string address_3;
	string phone_number_3;
	int math_2, physical_2, english_2, c_lan_2;
	string title, title1, zhuan;
	double wages, wages1;
	char tag;
	int sc;

	string phone_number;

	cin >> number_1 >> name_1 >> sex_1 >> address_1 >> phone_number_1;
	cin >> math >> physical >> english >> c_lan;
	Student zp(number_1, name_1, sex_1, address_1, phone_number_1,
		math, physical, english, c_lan);
	cout << "学生信息:"<<endl;
	zp.print();
	cin >> tag >> sc;
	zp.setScore(tag, sc);
	zp.print();
	

	
	cin >> number_2 >> name_2 >> sex_2 >> address_2 >> phone_number_2;
	cin >> title >> wages;
	Teacher ls(number_2, name_2, sex_2, address_2, phone_number_2, title, wages);
	cout << "教师信息:" << endl;
	ls.print();

	
	cin >> number_3 >> name_3 >> sex_3 >> address_3 >> phone_number_3;
	cin >> math_2 >> physical_2 >> english_2 >> c_lan_2;
	cin >> title1 >> wages1;
	cin >> zhuan;
	Ta zhujiao(number_3, name_3, sex_3, address_3, phone_number_3,
		math_2, physical_2, english_2, c_lan_2, title1, wages1, zhuan);
	cout << "TA信息:" << endl;
	zhujiao.print();



}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bmNkotc2AECynaY6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值