【题3】在习题4-3的基础上,Person类添加日期类对象作数据成员,由Person类公有派生出Student类和Teacher类,由Student类和Teacher类公有派生子类TA(助教博士生)类,添加数据成员:专业(string类型),添加构造函数、setDate()(设置出生年月日)、输出函数(输出一个TA对象的全部信息)。注意虚基类的使用。类之间的关系如图4-1所示。 主函数中定义一个TA类对象,其各数据成员的初始值由键盘输入,输出TA类对象的全部信息;修改TA对象的出生年月日,数据由键盘输入(按年月日顺序),再输出TA类对象的全部信息。
时间: 2023-11-28 21:50:36 浏览: 63
设计一个Person类,有Person类派生一个Student类和一个Teacher类
我会为您逐步实现这道题目。
首先,我们需要定义一个日期类对象。可以参考习题4-3中的`Date`类,这里就不再赘述。
然后,我们定义一个`Person`类,其中包含姓名、性别和出生日期等成员变量,以及相应的构造函数和输出函数。代码如下:
```cpp
class Person {
public:
Person(string name_, char gender_, const Date& birthday_)
: name(name_), gender(gender_), birthday(birthday_) {}
void print() const {
cout << "Name: " << name << endl;
cout << "Gender: " << gender << endl;
cout << "Birthday: ";
birthday.print();
}
protected:
string name;
char gender;
Date birthday;
};
```
接下来,我们公有派生出一个`Student`类和一个`Teacher`类。代码如下:
```cpp
class Student : virtual public Person {
public:
Student(string name_, char gender_, const Date& birthday_, double score_)
: Person(name_, gender_, birthday_), score(score_) {}
void print() const {
Person::print();
cout << "Score: " << score << endl;
}
protected:
double score;
};
class Teacher : virtual public Person {
public:
Teacher(string name_, char gender_, const Date& birthday_, double salary_)
: Person(name_, gender_, birthday_), salary(salary_) {}
void print() const {
Person::print();
cout << "Salary: " << salary << endl;
}
protected:
double salary;
};
```
注意到我们使用了虚基类(`virtual public Person`),这是为了避免多重继承导致的二义性问题。
接下来,我们公有派生出一个`TA`类,并添加专业成员变量。代码如下:
```cpp
class TA : public Student, public Teacher {
public:
TA(string name_, char gender_, const Date& birthday_, double score_, double salary_, const string& major_)
: Person(name_, gender_, birthday_), Student(name_, gender_, birthday_, score_), Teacher(name_, gender_, birthday_, salary_), major(major_) {}
void setDate(int year, int month, int day) {
birthday.setDate(year, month, day);
}
void print() const {
Person::print();
cout << "Score: " << score << endl;
cout << "Salary: " << salary << endl;
cout << "Major: " << major << endl;
}
private:
string major;
};
```
最后,我们在主函数中定义一个`TA`对象,并通过键盘输入初始化其数据成员,然后输出该对象的全部信息。接着,我们修改该对象的出生年月日,并通过键盘输入更新,再输出该对象的全部信息。完整代码如下:
阅读全文