持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情。
题目描述
1、建立如下的类继承结构:
1)定义一个人员类CPeople,其属性(保护类型)有:姓名、性别、年龄;
2)从CPeople类派生出学生类CStudent,添加属性:学号和入学成绩;
3)从CPeople类再派生出教师类CTeacher,添加属性:职务、部门;
4)从CStudent和CTeacher类共同派生出在职研究生类CGradOnWork,添加属性:研究方向、导师;
2、分别定义以上类的构造函数、输出函数print及其他函数(如需要)。
3、在主函数中定义各种类的对象,并测试之。
输入
第一行:姓名性别年龄
第二行:学号成绩
第三行:职务部门
第四行:研究方向导师
输出
第一行:People:
第二行及以后各行:格式见Sample
输入样例1
wang-li m 23
2012100365 92.5
assistant computer
robot zhao-jun
输出样例1
People:
Name: wang-li
Sex: m
Age: 23
Student:
Name: wang-li
Sex: m
Age: 23
No.: 2012100365
Score: 92.5
Teacher:
Name: wang-li
Sex: m
Age: 23
Position: assistant
Department: computer
GradOnWork:
Name: wang-li
Sex: m
Age: 23
No.: 2012100365
Score: 92.5
Position: assistant
Department: computer
Direction: robot
Tutor: zhao-jun
思路分析
这道题涉及到类的多重继承,CPeople作为基类派生出CStudent和CTeacher,然后由这两个子类共同派生出CGradOnWork类。
问题是CStudent和CTeacher都分别继承了CPeople的属性,而CGradOnWork同时把它们相同的属性都继承了,这就导致了CGradOnWork在访问CPeople的属性时会不知道是去找CStudent的还是去找CTeacher的。
因此,需要在父类继承的时候加上virtual修饰,这样多重继承的时候就只会继承一个相同的属性。
还有一个问题就是在多重继承的类的构造函数带参数的时候,需要把所有父辈的构造函数的参数带上,包括祖辈的。
AC代码
#include<iostream>
#include<string>
using namespace std;
class CPeople
{
protected:
string name,sex;
int age;
public:
CPeople(string name,string sex,int age):name(name),sex(sex),age(age){}
void print(){cout<<"People:"<<endl<<"Name: "<<name<<endl<<"Sex: "<<sex<<endl<<"Age: "<<age<<endl<<endl;}
};
class CStudent:virtual public CPeople
{
protected:
string idnum;
float score;
public:
CStudent(string name,string sex,int age,string idnum,float score):CPeople(name,sex,age),idnum(idnum),score(score){}
void print(){cout<<"Student:"<<endl<<"Name: "<<name<<endl<<"Sex: "<<sex<<endl<<"Age: "<<age<<endl<<"No.: "<<idnum<<endl<<"Score: "<<score<<endl<<endl;}
};
class CTeacher:virtual public CPeople
{
protected:
string work,department;
public:
CTeacher(string name,string sex,int age,string work,string department):CPeople(name,sex,age),work(work),department(department){}
void print(){cout<<"Teacher:"<<endl<<"Name: "<<name<<endl<<"Sex: "<<sex<<endl<<"Age: "<<age<<endl<<"Position: "<<work<<endl<<"Department: "<<department<<endl<<endl;}
};
class CGradOnWork:public CStudent,public CTeacher
{
protected:
string direction,tutor;
public:
CGradOnWork(string name,string sex,int age,string idnum,float score,string work,string department,string direction,string tutor):CPeople(name,sex,age),CStudent(name,sex,age,idnum,score),CTeacher(name,sex,age,work,department),direction(direction),tutor(tutor){}
void print(){cout<<"GradOnWork:"<<endl<<"Name: "<<name<<endl<<"Sex: "<<sex<<endl<<"Age: "<<age<<endl<<"No.: "<<idnum<<endl<<"Score: "<<score<<endl<<"Position: "<<work<<endl<<"Department: "<<department<<endl<<"Direction: "<<direction<<endl<<"Tutor: "<<tutor<<endl<<endl;}
};
int main()
{
string name,sex,idnum,work,department,direction,tutor;
int age;
float score;
cin>>name>>sex>>age>>idnum>>score>>work>>department>>direction>>tutor;
CPeople people(name,sex,age);
people.print();
CStudent student(name,sex,age,idnum,score);
student.print();
CTeacher teacher(name,sex,age,work,department);
teacher.print();
CGradOnWork outman(name,sex,age,idnum,score,work,department,direction,tutor);
outman.print();
}