//设计一个人物信息描述类,可以分3种级别存储人物信息(普通信息,学生信息,专业学生信息)
//Person,通用人物描述基类,可以存储各职业人物信息。
//Student,学生描述类,可以存储各种学生人物信息。
//Graduate,专业学生描述类,可以存储专业学生人物信息。
//在主函数测试中使用多态方式不同级别的人物信息。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

//创建一个数字基类
#include<iostream>
#include<string>
using namespace std;

// 通用人物描述基类
class Person
{
protected:
    int     mID;    // 编号
    string  mName;  // 名字
    string  mPart;  // 部门/系别
    bool    mbMale; // 性别
    int     mAge;   // 年龄

public:
    Person(int id, const string& name, bool isMale, int age, const string& part);
    ~Person(){}
    virtual void show() const;
};

// 学生描述类
class Student :public Person
{
    int     mScore; // 分数
public:
    Student(int id, const string& name, bool bMale, int age, const string& xibie, int score);
    // 实现自己的输出
    virtual void show()const;
};

// 老师描述类
class Teacher :public Person
{
    string  mLevel; // 职称
public:
    Teacher(int id, const string& name, bool bMale, int age, const string& bumen, const string& zhicheng);
    // 实现自己的输出
    virtual void show() const;
};

//-------------Person实现-------------------
Person::Person(int id, const string& name, bool isMale, int age, const string& part)
    :mID(id), mName(name), mbMale(isMale), mAge(age), mPart(part)
{
}

void Person::show()const
{
    // 输出通用信息
    cout << "ID: " << mID << ",";
    cout << "名字: "<< mName << ",";

    if (mbMale) cout << "男";
    else cout << "女";

    cout << "," << mAge << "岁";
}

//-------------Student实现-------------------
Student::Student(int id, const string& name, bool bMale, int age, const string& xibie, int score)
    :Person(id, name, bMale, age, xibie), mScore(score)// 初始化父类 + 自身变量
{
}

void Student::show() const
{
    // 调用父类方法
    Person::show();
    // 实现自己的输出
    cout << ", 系别: " << mPart << ", 分数: " << mScore << endl;
}

//-------------Teacher实现-------------------
Teacher::Teacher(int id, const string& name, bool bMale, int age, const string& bumen, const string& zhicheng)
    :Person(id, name, bMale, age, bumen), mLevel(zhicheng)// 初始化父类 + 自身变量
{
}

void Teacher::show() const
{
    // 调用父类方法
    Person::show();
    // 实现自己的输出
    cout << ", 部门: " << mPart << ", 职称: " << mLevel << endl;
}

// 多态方法调用
void fun2(Person *person)
{
    person->show();
}

//打印输出
int main(void)
{
    Student st(2,"李红", false, 18, "电子学", 95);
    Teacher gt(5,"王涛", true, 25, "政教处", "副主任");
    Person *p[] = { &st, &gt };

    fun2(&st);
    fun2(&gt);

    // 暂停
    system("pause");
    return EXIT_SUCCESS;
}