在上面生成的基础上对>><<两个运算符都进行重载使得能够直接对对象信息进行输入输出,并且使变量的初始画的值从键盘上输入,还需要改为对每一个变量都可以修改
时间: 2025-02-10 22:13:15 浏览: 31
为了实现您的需求,我们需要对 `Person` 类及其派生类进行以下修改:
1. **重载 `>>` 和 `<<` 运算符**:允许从标准输入和输出流中读取和写入对象信息。
2. **从键盘输入初始化对象**:提供一个函数或构造函数来从键盘输入初始化对象。
3. **允许修改每个变量**:已经提供了 `setName`, `setSex`, `setAge` 等成员函数,但需要确保这些函数在所有派生类中都能使用。
### 修改后的代码
#### Person.h
```cpp
#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string>
using namespace std;
// person基类
class person {
protected:
string name;
char sex;
int age;
public:
// 构造函数
person(string name = "", char sex = ' ', int age = 0) : name(name), sex(sex), age(age) {
cout << "person 基类的 构造函数被调用了!" << endl;
}
// 虚析构 函数
virtual ~person() {
cout << "person 基类的析构 函数被调用了!" << endl;
}
// 输出信息的函数
virtual void printInfo() const;
// 输入信息的函数
virtual void readInfo();
// 运算符重载
friend ostream& operator<<(ostream& os, const person& p);
friend istream& operator>>(istream& is, person& p);
// 服务于用户的函数
void setName(const string& newName) { this->name = newName; }
void setSex(char newSex) { this->sex = newSex; }
void setAge(int newAge) { this->age = newAge; }
};
// teacher类
class teacher : virtual public person {
private:
string id;
string rank;
int salary;
public:
// 构造函数
teacher(string id = "", string rank = "", int salary = 0, string name = "", char sex = ' ', int age = 0)
: person(name, sex, age), id(id), rank(rank), salary(salary) {
cout << "teacher派生类的构造函数被调用了!" << endl;
}
// 虚析构 函数
virtual ~teacher() {
cout << "teacher派生类 的析构函数 被调用了!" << endl;
}
// 输出信息的函数
virtual void printInfo() const;
// 输入信息的函数
virtual void readInfo();
// 服务于用户的函数
void setId(const string& newId) { this->id = newId; }
void setRank(const string& newRank) { this->rank = newRank; }
void setSalary(int newSalary) { this->salary = newSalary; }
};
// student类
class student : virtual public person {
private:
string id;
string class_name;
string major;
int entrance_score;
public:
// 构造函数
student(string id = "", string class_name = "", string major = "", int entrance_score = 0, string name = "", char sex = ' ', int age = 0)
: person(name, sex, age), id(id), class_name(class_name), major(major), entrance_score(entrance_score) {
cout << "student派生类的构造函数被调用了!" << endl;
}
// 虚析构 函数
virtual ~student() {
cout << "student派生类 的析构函数 被调用了!" << endl;
}
// 输出信息的函数
virtual void printInfo() const;
// 输入信息的函数
virtual void readInfo();
// 服务于用户的函数
void setId(const string& newId) { this->id = newId; }
void setClassName(const string& newClass) { this->class_name = newClass; }
void setMajor(const string& newMajor) { this->major = newMajor; }
void setEntranceScore(int newScore) { this->entrance_score = newScore; }
};
// 多重继承
// 在读研究生类
class Postgraduate : public teacher, public student {
public:
// 构造函数
Postgraduate(string teacher_id = "", string teacher_rank = "", int teacher_salary = 0,
string student_id = "", string class_name = "", string major = "", int entrance_score = 0,
string name = "", char sex = ' ', int age = 0)
: person(name, sex, age), teacher(teacher_id, teacher_rank, teacher_salary, name, sex, age),
student(student_id, class_name, major, entrance_score, name, sex, age) {
cout << "Postgraduate派生类的构造函数被调用了!" << endl;
}
// 虚析构 函数
virtual ~Postgraduate() {
cout << "Postgraduate派生类 的析构函数 被调用了!" << endl;
}
// 输出信息的函数
virtual void printInfo() const;
// 输入信息的函数
virtual void readInfo();
};
// 在职教师类
class In_Service_Teacher : public teacher, public student {
private:
string work_unit;
public:
// 构造函数
In_Service_Teacher(string teacher_id = "", string teacher_rank = "", int teacher_salary = 0,
string student_id = "", string class_name = "", string major = "", int entrance_score = 0,
string name = "", char sex = ' ', int age = 0, string work_unit = "")
: person(name, sex, age), teacher(teacher_id, teacher_rank, teacher_salary, name, sex, age),
student(student_id, class_name, major, entrance_score, name, sex, age), work_unit(work_unit) {
cout << "In_Service_Teacher 派生类的构造函数被调用了!" << endl;
}
// 虚析构 函数
virtual ~In_Service_Teacher() {
cout << "In_Service_Teacher 派生类 的析构函数 被调用了!" << endl;
}
// 输出信息的函数
virtual void printInfo() const;
// 输入信息的函数
virtual void readInfo();
// 服务于用户的函数
void setWorkUnit(const string& newUnit) { this->work_unit = newUnit; }
};
#endif // PERSON_H
```
#### Person.cpp
```cpp
#include "Person.h"
#include <iostream>
using namespace std;
// 输出person 基类的 函数
void person::printInfo() const {
cout << "姓名:" << name << ",性别:" << sex << ",年龄:" << age << endl;
}
// 输入person 基类的 函数
void person::readInfo() {
cout << "请输入姓名: ";
getline(cin >> ws, name);
cout << "请输入性别 (m/f): ";
cin >> sex;
cout << "请输入年龄: ";
cin >> age;
}
// 运算符重载函数
ostream& operator<<(ostream& os, const person& p) {
os << p.name << " " << p.sex << " " << p.age;
return os;
}
istream& operator>>(istream& is, person& p) {
is >> p.name >> p.sex >> p.age;
return is;
}
// 输出teacher派生类的函数
void teacher::printInfo() const {
person::printInfo();
cout << "工号:" << id << ",职称:" << rank << ",工资:" << salary << endl;
}
// 输入teacher派生类的函数
void teacher::readInfo() {
person::readInfo();
cout << "请输入工号: ";
cin >> id;
cout << "请输入职称: ";
cin >> rank;
cout << "请输入工资: ";
cin >> salary;
}
// 输出student派生类的函数
void student::printInfo() const {
person::printInfo();
cout << "学号:" << id << ",班级:" << class_name << ",专业:" << major << ",入学成绩:" << entrance_score << endl;
}
// 输入student派生类的函数
void student::readInfo() {
person::readInfo();
cout << "请输入学号: ";
cin >> id;
cout << "请输入班级: ";
cin >> class_name;
cout << "请输入专业: ";
cin >> major;
cout << "请输入入学成绩: ";
cin >> entrance_score;
}
// 输出Postgraduate派生类的函数
void Postgraduate::printInfo() const {
student::printInfo();
teacher::printInfo();
}
// 输入Postgraduate派生类的函数
void Postgraduate::readInfo() {
teacher::readInfo();
student::readInfo();
}
// 输出In_Service_Teacher派生类的函数
void In_Service_Teacher::printInfo() const {
student::printInfo();
teacher::printInfo();
cout << "工作单位:" << work_unit << endl;
}
// 输入In_Service_Teacher派生类的函数
void In_Service_Teacher::readInfo() {
teacher::readInfo();
student::readInfo();
cout << "请输入工作单位: ";
cin >> work_unit;
}
```
#### Main.cpp
```cpp
#include "Person.h"
int main() {
// 声明两个具体对象
Postgraduate pg;
In_Service_Teacher ist;
// 从键盘输入初始化对象
cout << "请输入Postgraduate的信息:" << endl;
pg.readInfo();
cout << "请输入In_Service_Teacher的信息:" << endl;
ist.readInfo();
while (true) {
cout << "请选择要编辑的信息 (1: 张三, 2: 王五, 0: 退出): ";
int choice;
cin >> choice;
if (choice == 0) break;
person* selectedPerson = (choice == 1) ? static_cast<person*>(&pg) : static_cast<person*>(&ist);
cout << "请输入新的姓名: ";
string newName;
cin >> newName;
selectedPerson->setName(newName);
cout << "请输入新的性别 (m/f): ";
char newSex;
cin >> newSex;
selectedPerson->setSex(newSex);
cout << "请输入新的年龄: ";
int newAge;
cin >> newAge;
selectedPerson->setAge(newAge);
if (dynamic_cast<teacher*>(selectedPerson)) {
cout << "请输入新的工号: ";
string newId;
cin >> newId;
dynamic_cast<teacher*>(selectedPerson)->setId(newId);
cout << "请输入新的职称: ";
string newRank;
cin >> newRank;
dynamic_cast<teacher*>(selectedPerson)->setRank(newRank);
cout << "请输入新的工资: ";
int newSalary;
cin >> newSalary;
dynamic_cast<teacher*>(selectedPerson)->setSalary(newSalary);
}
if (dynamic_cast<student*>(selectedPerson)) {
cout << "请输入新的学号: ";
string newId;
cin >> newId;
dynamic_cast<student*>(selectedPerson)->setId(newId);
cout << "请输入新的班级: ";
string newClass;
cin >> newClass;
dynamic_cast<student*>(selectedPerson)->setClassName(newClass);
cout << "请输入新的专业: ";
string newMajor;
cin >> newMajor;
dynamic_cast<student*>(selectedPerson)->setMajor(newMajor);
cout << "请输入新的入学成绩: ";
int newScore;
cin >> newScore;
dynamic_cast<student*>(selectedPerson)->setEntranceScore(newScore);
}
if (dynamic_cast<In_Service_Teacher*>(selectedPerson)) {
cout << "请输入新的工作单位: ";
string newUnit;
cin >> newUnit;
dynamic_cast<In_Service_Teacher*>(selectedPerson)->setWorkUnit(newUnit);
}
selectedPerson->printInfo();
}
return 0;
}
```
### 解释
1. **重载 `>>` 和 `<<` 运算符**:在 `Person.h` 中定义了 `friend` 函数 `operator<<` 和 `operator>>`,并在 `Person.cpp` 中实现了它们。
2. **从键盘输入初始化对象**:为每个类添加了 `readInfo` 成员函数,用于从键盘读取对象信息。
3. **允许修改每个变量**:通过 `setName`, `setSex`, `setAge` 等成员函数,可以在主程序中动态修改对象的属性。
这样,您就可以从键盘输入初始化对象,并在运行时动态修改对象的各个属性。
阅读全文
相关推荐



















