oop实习-虚基类

前言

NWAFU P1381


一、题目描述

题目描述

(1)定义人员类Person:
公有成员:姓名(Name);
保护成员:性别(Gender),年龄(Age); 

构造函数和析构函数 

(2) 从人员类Person派生学生记录类StudentRecord:
添加公有成员:学号(Number),班级(ClassName),
添加静态公有成员:学生总人数(TotalCount);
添加保护成员:平均成绩(Score);
实现构造函数和析构函数。
(3) 从人员类Person派生教师记录类TeacherRecord:
添加公有成员:学院(CollegeName),系(DepartmentName);
添加保护成员:教龄(Year);
实现构造函数和析构函数。


(4)从学生记录类StudentRecord和教师记录类TeacherRecord派生学生助教类TeachingAssistant:
添加公有成员:辅导课程(LectureName);
实现公有函数:显示人员信息(Show),屏幕打印 姓名,性别,年龄,学号,班级,学生总人数,平均成绩,学院,系,教龄,辅导课程。
实现构造函数和析构函数。为检验类间结构设计是否正确,设计函数void SetName(String name)实现更改一名助教的姓名的功能。

创建一个助教类的对象

助教
姓名 性别 年龄 学号 班级 平均成绩 学院 系 教龄 辅导课程
郑七 男 22 2010123 软20101 89         信息 软件    1 数据结构
显示其信息。

调用更改姓名的函数,更改其姓名为“郑八”,并再次显示其信息。

提示

各类的构造函数和析构函数都有输出。

调用公有函数Show,以分别显示各个记录的人员信息。

在派生助教类时,使用虚基类。

二、设计步骤

代码实现:

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

class Person {
public:
    string Name;
protected:
    string Gender;
    int Age;

public:
    Person(const string& name, const string& gender, int age) : Name(name), Gender(gender), Age(age) {
        cout << "Person" << Name << "constructed" << endl;
    }

    virtual ~Person() {
        cout << "Person" << Name << "destructed" << endl;
    }
};

class StudentRecord : virtual public Person {  // 虚拟继承
public:
    string Number;
    string ClassName;
    static int TotalCount;
protected:
    float Score;

public:
    StudentRecord(const string& name, const string& gender, int age, const string& number, const string& className, float score)
        : Person(name, gender, age), Number(number), ClassName(className), Score(score) {
        TotalCount++;
        cout << "Student" << Name << "constructed" << endl;
    }

    ~StudentRecord() {
        cout << "Student" << Name << "destructed" << endl;
    }
};

int StudentRecord::TotalCount = 0;

class TeacherRecord : virtual public Person {  // 虚拟继承
public:
    string CollegeName;
    string DepartmentName;
protected:
    int Year;

public:
    TeacherRecord(const string& name, const string& gender, int age, const string& collegeName, const string& departmentName, int year)
        : Person(name, gender, age), CollegeName(collegeName), DepartmentName(departmentName), Year(year) {
        cout << "teacher" << Name << "constructed" << endl;
    }

    ~TeacherRecord() {
        cout << "teacher" << Name << "destructed" << endl;
    }
};

class TeachingAssistant : public StudentRecord, public TeacherRecord {
public:
    string LectureName;

public:
    TeachingAssistant(const string& name, const string& gender, int age, const string& number, const string& className, float score,
                      const string& collegeName, const string& departmentName, int year, const string& lectureName)
        : Person(name, gender, age), StudentRecord(name, gender, age, number, className, score),
          TeacherRecord(name, gender, age, collegeName, departmentName, year), LectureName(lectureName) {
        cout << "teachingassistant" << Name << "constructed" << endl;
    }

    void Show() {
        cout << "Name:" << Name << " ";
        cout << "Gender:" << Gender << " ";
        cout << "Age:" << Age << " ";
        cout << "Number:" << Number << " ";
        cout << "ClassName:" << ClassName << " ";
        cout << "TotalCount:" << TotalCount << " ";
        cout << "Score:" << Score << " ";
        cout << "CollegeName:" << CollegeName << " ";
        cout << "DepartmentName:" << DepartmentName << " ";
        cout << "Year:" << Year << " ";
        cout << "LectureName:" << LectureName << endl;
    }

    void SetName(const string& name) {
        Name = name;
    }

    ~TeachingAssistant() {
        cout << "teachingassistant" << Name << "destructed" << endl;
    }
};

int main() {
    TeachingAssistant ta("郑七", "男", 22, "2010123", "软20101", 89.0, "信息", "软件", 1, "数据结构");

    // cout << "初始信息:" << endl;
    ta.Show();

    ta.SetName("郑八");

    // cout << "\n更改后的信息:" << endl;
    ta.Show();

    return 0;
}

PS:输出格式超抽象! 


总结

EOF

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值