【上机考试 第二题 继承派生多态】

文章描述了一个C++编程问题,要求定义一个抽象基类Student,包含姓名、年龄和籍贯等属性,并有更新和显示信息的纯虚函数。然后派生出两个子类CollegeStu和highSchoolStu,分别增加大学生属性和高中生成绩,并重写更新和显示函数,体现了继承和多态性。示例展示了如何输入和输出学生信息。
摘要由CSDN通过智能技术生成

题目描述:

请定义一个学生Student类作为抽象基类,并派生出CollegeStu(大学生)类和highSchoolStu(高中生)类,要求如下。

1、抽象基类Student类:

有保护成员变量name,age, domicile分别表示姓名(字符串类型),年龄(整型)和户籍所在地(字符串类型),纯虚函数UpdateStu(char*,int)用于更新学生信息,纯虚函数Show()用于显示学生信息。

2、派生类CollegeStu类:

新增成员变量attribute(大学生属性)。常见的大学生有四种(“undergraduate”本科生,“master”硕士生,“doctoral”博士生和”other”其他),重写UpdateStu(char*,int)和Show()函数,修改大学生的户籍所在地和大学生属性,并按要求输出大学生信息,格式为姓名 年龄 大学生属性 籍贯,如TomWang 23 master Tianjin

3、派生类highSchoolStu

新增成员变量score(成绩),重写UpdateStu(char* ,int)和Show()函数,修改高中生的籍贯和成绩属性,并按要求输出高中生信息,格式为姓名 年龄 成绩 籍贯TomWang 23 100 Tianjin

注:以上类根据需要自行添加构造函数,必须使用继承,并使用动态联编的方式体现多态性,否则计0分。

输入:

第一行是大学生的信息,分别是姓名,年龄,大学生属性和籍贯,第二行为修改后的大学生户籍所在地和大学生属性,第三行是高中生信息,分别是姓名,年龄,成绩和籍贯,第四行为修改后的高中生籍贯和成绩。 其中姓名和籍贯为字符串(长度不超过256,无空格),年龄和成绩为整数,大学生属性为数字0(表示本科生),1(表示硕士生),2(表示博士生)或3(表示其他)。

输出:

四行,依次是修改前的大学生信息,修改后大学生信息,修改前的高中生信息,修改后的高中生信息。

样例输入:

WangXiaoyu 19 0 Henan
Beijing 1
TiZhenNan 13 100 Tianjin
Hebei 90

样例输出:

WangXiaoyu 19 undergraduate Henan
WangXiaoyu 19 master Beijing
TiZhenNan 13 100 Tianjin
TiZhenNan 13 90 Hebei
#include <iostream>
#include <cstring>
using namespace std;

// 抽象基类Student
class Student {
protected:
    string name;
    int age;
    string domicile;
public:
    // 构造函数,初始化成员变量
    Student(string n = "", int a = 0, string d = "") : name(n), age(a), domicile(d) {}
    // 纯虚函数,需要在派生类中重写实现
    virtual void Show() = 0;
    virtual void UpdateStu(char* d, int a) = 0;
};

// 派生类CollegeStu,公有继承自Student
class CollegeStu : public Student {
private:
    string attribute; // 新增的成员变量,表示大学生属性
public:
    // 构造函数,初始化成员变量
    CollegeStu(string n = "", int a = 0, string d = "", string at = "") : Student(n, a, d), attribute(at) {}
    // 重写父类的纯虚函数,按需求实现函数体
    void Show() {
        cout << name << " " << age << " " << attribute << " " << domicile << endl;
    }
    void UpdateStu(char* d, int a) {
        domicile = d;
        switch (a) {
        case 0:
            attribute = "undergraduate";
            break;
        case 1:
            attribute = "master";
            break;
        case 2:
            attribute = "doctoral";
            break;
        case 3:
            attribute = "other";
            break;
        }
    }
};

// 派生类highSchoolStu,公有继承自Student
class highSchoolStu : public Student {
private:
    int score; // 新增的成员变量,表示高中生的考试成绩
public:
    // 构造函数,初始化成员变量
    highSchoolStu(string n = "", int a = 0, string d = "", int s = 0) : Student(n, a, d), score(s) {}
    // 重写父类的纯虚函数,按需求实现函数体
    void Show() {
        cout << name << " " << age << " " << score << " " << domicile << endl;
    }
    void UpdateStu(char* d, int s) {
        domicile = d;
        score = s;
    }
};

int main() {
    string n, d;
    int a, b, s;
    char c;
    // 读入大学生信息,创建CollegeStu对象,并调用UpdateStu函数更新信息
    cin >> n >> a >> b >> d;
    CollegeStu co_stu(n, a, d, "");
    cin >> d >> s;
    co_stu.UpdateStu(&d[0], s); // 将字符串转化为字符数组
    co_stu.Show(); // 输出修改后的大学生信息
    // 读入高中生信息,创建highSchoolStu对象,并调用UpdateStu函数更新信息
    cin >> n >> a >> s >> d;
    highSchoolStu hs_stu(n, a, d, s);
    cin >> d >> s;
    hs_stu.UpdateStu(&d[0], s); // 将字符串转化为字符数组
    hs_stu.Show(); // 输出修改后的高中生信息
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纳皮尔的骨头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值