定义一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类。教师类增加工号、职称和工资,学生类增加学号、班级、专业和入学成绩。编程要求:1、设计虚函数输出教师和学生的基本信息;2、计算教师的平均工资并输出;3、使用友元函数重载运算符“<”,找出入学成绩最高的学生并输出;
时间: 2023-12-29 20:02:24 浏览: 84
好的,我来回答你的问题。
这是一个面向对象的编程问题,需要用到继承、虚函数、友元函数等知识点。
首先,我们定义一个基类Person,包含姓名、性别和年龄三个成员变量:
```c++
class Person {
protected:
string name;
string gender;
int age;
public:
Person(string name, string gender, int age) : name(name), gender(gender), age(age) {}
virtual void printInfo() {
cout << "姓名:" << name << endl;
cout << "性别:" << gender << endl;
cout << "年龄:" << age << endl;
}
};
```
然后,我们从Person类派生出Teacher类和Student类,并在Teacher类中增加工号、职称和工资三个成员变量,在Student类中增加学号、班级、专业和入学成绩四个成员变量:
```c++
class Teacher : public Person {
private:
int id;
string title;
double salary;
public:
Teacher(string name, string gender, int age, int id, string title, double salary)
: Person(name, gender, age), id(id), title(title), salary(salary) {}
virtual void printInfo() {
Person::printInfo();
cout << "工号:" << id << endl;
cout << "职称:" << title << endl;
cout << "工资:" << salary << endl;
}
friend double averageSalary(Teacher* teachers, int n);
};
class Student : public Person {
private:
string sid;
string cls;
string major;
double score;
public:
Student(string name, string gender, int age, string sid, string cls, string major, double score)
: Person(name, gender, age), sid(sid), cls(cls), major(major), score(score) {}
virtual void printInfo() {
Person::printInfo();
cout << "学号:" << sid << endl;
cout << "班级:" << cls << endl;
cout << "专业:" << major << endl;
cout << "入学成绩:" << score << endl;
}
friend bool operator<(const Student& s1, const Student& s2);
};
```
注意,我们在基类Person中定义了一个虚函数printInfo(),它被声明为virtual,表示它可以被子类重写。在Teacher类和Student类中,我们都重写了printInfo(),以便输出自己的成员变量。这就是多态的应用。
此外,我们在Teacher类中还定义了一个友元函数averageSalary(),用于计算教师的平均工资。在Student类中定义了一个友元函数operator<(),用于比较两个学生的入学成绩。
接下来,实现averageSalary()函数和operator<()函数:
```c++
double averageSalary(Teacher* teachers, int n) {
double sum = 0;
for (int i = 0; i < n; i++) {
sum += teachers[i].salary;
}
return sum / n;
}
bool operator<(const Student& s1, const Student& s2) {
return s1.score < s2.score;
}
```
最后,我们可以在主函数中创建若干个Teacher对象和Student对象,然后调用它们的printInfo()函数输出基本信息,计算教师的平均工资并输出,找出入学成绩最高的学生并输出。
完整代码如下:
阅读全文