设计一个人类Person,有编号、姓名两个数据成员;Person类是抽象类,类中定义虚函数getMessage()函数返回对象的信息。从Person类派生出2个具体类:学生类Student和教师类Teacher。其中,学生数据有编号、姓名、班级,教师数据有编号、姓名、部门。学生类Student和教师类Teacher都有带3个参数的构造函数,通过初始化表向父类构造函数传递编号、姓名的值。Student类重写getMessage()函数,返回信息以“学生:”开头。Teacher类重写getMessage()函数,返回信息以“教师:”开头。main函数中,定义一个Student类对象和一个Teacher类对象,定义对象时通过参数给出数据成员的值。通过基类指针来调用派生类中的虚函数getMessage(),输出学生类和教师类对象的信息。提示:在函数中可以使用stringstream类实现构造所需字符串并返回字符串,例如:
stringstream oss;
oss<<""编号:""<<id<<"",姓名:""<<name;
string message=oss.str();
return message;
注:stringstream类需要引入头文件#include<sstream>
#include <sstream>
#include <string>
#include <iostream>
class Person {
protected:
std::string id;
std::string name;
public:
Person(std::string id, std::string name) : id(id), name(name) {}
virtual std::string getMessage() = 0;
};
class Student : public Person {
private:
std::string classId;
public:
Student(std::string id, std::string name, std::string classId)
: Person(id, name), classId(classId) {}
std::string getMessage() override {
std::stringstream oss;
oss << "学生:编号:" << id << ", 姓名:" << name << ", 班级:" << classId;
return oss.str();
}
};
class Teacher : public Person {
private:
std::string department;
public:
Teacher(std::string id, std::string name, std::string department)
: Person(id, name), department(department) {}
std::string getMessage() override {
std::stringstream oss;
oss << "教师:编号:" << id << ", 姓名:" << name << ", 部门:" << department;
return oss.str();
}
};
int main() {
Person* persons[2];
persons[0] = new Student("001", "张三", "计算机科学与技术");
persons[1] = new Teacher("002", "李四", "计算机科学与技术");
for (int i = 0; i < 2; ++i) {
std::cout << persons[i]->getMessage() << std::endl;
}
delete persons[0];
delete persons[1];
return 0;
}