将Student类作为基类,派生出本科生类(UnderGraduated)和研究生类(Graduated), class UnderGraduated : public Student { public: //请定义构造函数 //请定义析构函数 double tuition() { cout << “本科生学费” << endl; } //重载运算符<<,实现本科生信息的输出,请定义。 friend ostream& operator<<(ostream& o, UnderGraduated& s); }; class Graduated : public Student { private: string tutor; //导师姓名 public: //请定义构造函数 //请定义析构函数 void setTutor(string t) { tutoe = t; } string getTutor() { return tutor; } //重载运算符<<,实现研究生信息的输出,请定义。 friend ostream& operator<<(ostream& o, Graduated& s); }; 要求: (1) 根据需要可以更改Student数据成员的访问属性; (2) 考虑能否直接使用myList对本科生和研究生进行统一管理,若不能,分析原因,有无解决方法。 2、使用模板方法重新定义myList,实现相同的功能。
时间: 2024-03-09 14:44:53 浏览: 62
写一个类Student,包含三个属性学号id,姓名name和年龄age;要求覆盖基类Object中的ToString()方法和Equals()方法,使得直接输出Student对象时输出的是对象的id,name和age信息;并且当两个对象的学号相同时认为它们相等;
4星 · 用户满意度95%
好的,针对你的问题,下面是我的回答:
对于派生出的本科生类和研究生类,可以按照以下方式定义构造函数和析构函数:
```cpp
//UnderGraduated构造函数
UnderGraduated(string n, string id, string m, double g): Student(n, id, m, g) {}
//UnderGraduated析构函数
~UnderGraduated() {}
//Graduated构造函数
Graduated(string n, string id, string m, double g, string t): Student(n, id, m, g), tutor(t) {}
//Graduated析构函数
~Graduated() {}
```
其中,本科生类和研究生类都继承自Student类,因此需要在构造函数中调用基类的构造函数来初始化成员变量。
重载运算符<<,可以在类内或者类外进行定义。这里我们在类内进行定义,代码如下:
```cpp
//UnderGraduated类重载运算符<<
friend ostream& operator<<(ostream& o, UnderGraduated& s) {
o << "姓名:" << s.getName() << ",学号:" << s.getId() << ",专业:" << s.getMajor() << ",绩点:" << s.getGPA() << endl;
return o;
}
//Graduated类重载运算符<<
friend ostream& operator<<(ostream& o, Graduated& s) {
o << "姓名:" << s.getName() << ",学号:" << s.getId() << ",专业:" << s.getMajor() << ",绩点:" << s.getGPA() << ",导师:" << s.getTutor() << endl;
return o;
}
```
对于myList能否直接使用来管理本科生和研究生,需要看具体实现。如果myList只需要存储Student类的对象指针,那么就可以直接使用。如果需要使用到本科生类或研究生类的特有函数,那么就需要进行强制类型转换,才能调用这些函数。但是,这样做不太安全,可能会出现类型转换错误的问题。因此,需要在具体实现时进行分析,看是否需要使用到本科生类或研究生类的特有函数。
如果想使用模板方法重新定义myList,可以按照以下步骤进行:
1. 定义一个模板类myList,用于管理对象。
```cpp
template <typename T>
class myList {
private:
vector<T*> v;
public:
void add(T* obj) {
v.push_back(obj);
}
void remove(T* obj) {
//查找obj在v中的位置,如果找到,就删除
typename vector<T*>::iterator it;
for (it = v.begin(); it != v.end(); it++) {
if (*it == obj) {
v.erase(it);
break;
}
}
}
void print() {
//输出v中所有元素
typename vector<T*>::iterator it;
for (it = v.begin(); it != v.end(); it++) {
cout << **it << endl;
}
}
~myList() {
//删除v中所有元素
typename vector<T*>::iterator it;
for (it = v.begin(); it != v.end(); it++) {
delete *it;
}
v.clear();
}
};
```
2. 在main函数中,创建本科生和研究生对象,并使用myList对它们进行管理。
```cpp
int main() {
UnderGraduated* u1 = new UnderGraduated("小明", "001", "计算机科学与技术", 3.5);
UnderGraduated* u2 = new UnderGraduated("小红", "002", "软件工程", 3.8);
Graduated* g1 = new Graduated("张三", "101", "计算机应用", 3.6, "李四");
Graduated* g2 = new Graduated("李四", "102", "信息管理", 4.0, "王五");
myList<Student> students; //创建一个myList对象,用于存储Student类型的对象指针
students.add(u1);
students.add(u2);
students.add(g1);
students.add(g2);
students.print();
students.remove(u1);
students.print();
students.remove(g2);
students.print();
return 0;
}
```
这里我们使用了模板类myList,可以对任意类型的对象进行管理。在main函数中,我们创建了本科生和研究生对象,并将它们添加到myList中进行管理。可以看到,myList可以正确地输出本科生和研究生的信息,并且可以对它们进行删除操作。
阅读全文