C++ 实验三

一、实验目的


1、理解类层次的概念及实现类层次的方法,掌握派生的类别与方式。

2、掌握派生类中如何使用基类的成员、基类成员在派生类中的访问控制。

3、理解派生类中构造函数与析构函数的定义方法和执行顺序。


二、实验内容


1、按照下面的类层次图要求编写程序。


 


注:Tutor类的student成员为层次图中的student类

每个类都有input()和print()成员函数。分别定义类Tutor和ST_Score的对象,分别输入若干个数据成员的值再显示出这些数据。

2、修改ST_Score类,添加成员函数用于计算成绩平均值。


#include <iostream>
using namespace std;

class Person
{
protected:
    Person(){}                        //构造方法
    Person(string na,string i)
    {
        name=na;
        id=i;
    }
    ~Person(){cout<<"调用Person类的"<<name<<"的析构函数."<<endl;} //析构方法
    string name;
    string id;
public:
    void inputName(string s){name=s;}
    void inputID(string s){id=s;}
    void printName(){cout<<"name: "<<name;}
    void printID(){cout<<"id: "<<id<<endl;}
    void printPersonAll()
    {
        printName();
        cout<<endl;
        printID();
    }
};

class Teacher:public Person
{
protected:
    Teacher(){}                                              //构造方法
    Teacher(string na,string i,string deg,string depart)
    {
        name=na;
        id=i;
        deg=degree;
        dep=depart;
    }
    ~Teacher(){cout<<"调用Teacher类的"<<name<<"的析构函数."<<endl;} 
    string degree;
    string dep;
public:
    void inputDegree(string s){degree=s;}
    void inputDep(string s){dep=s;}
    void printDegree(){cout<<"degree: "<<degree<<endl;}
    void printDep(){cout<<"department: "<<dep<<endl;}
    void printTeAll()
    {
        printPersonAll();
        printDegree();
        printDep();
    }
};

class Student:public Person
{
protected:
    int age;
    string stuID;
public:
    Student(){}                                    //构造方法
    Student(string na,string i,int a,string stn)
    {
        name=na;
        id=i;
        age=a;
        stuID=stn;
    }
    ~Student(){cout<<"调用Student类的"<<name<<"的析构函数."<<endl;} 
    void inputAge(int a){age=a;}
    void inputStuID(string s){stuID=s;}
    void printAge(){cout<<"Age: "<<age<<endl;}
    void printStuID(){cout<<"Student's Number: "<<stuID<<endl;}
    void printStAll()
    {
        printPersonAll();
        printAge();
        printStuID();
    }
};

class Tutor:public Teacher
{
private:
    int stuNum;
    Student *student;
    string meeting_Times;
public:
    Tutor(){}                                           //构造方法
    Tutor(string na,string i,string depa,string MT,string deg,int stN,Student *st)
    {
        name=na;
        id=i;
        dep=depa;
        meeting_Times=MT;
        degree=deg;
        stuNum=stN;
        student=st;
    }
    ~Tutor(){cout<<"调用Tutor类的"<<name<<"的析构函数."<<endl;}//析构方法
    void addStudent()                              //添加学生
    {
        Student *p=new Student[stuNum+1];
        for(int i=0;i<stuNum;i++)
        {
            p[i]=student[i];
        }
        stuNum++;
        string s;
        int a;
        cout<<"请输入姓名:";
        cin>>s;
        p[stuNum-1].inputName(s);
        cout<<"请输入ID:";
        cin>>s;
        p[stuNum-1].inputID(s);
        cout<<"请输入年龄:";
        cin>>a;
        p[stuNum-1].inputAge(a);
        cout<<"请输入学号:";
        cin>>s;
        p[stuNum-1].inputStuID(s);
        student=p;
        cout<<endl<<"添加成功!现在"<<name<<"的学生有:"<<endl;
        printStu();
        cout<<endl;
    }
    void inputMT(string s){meeting_Times=s;}
    void printMT(){cout<<"Meeting Time: "<<meeting_Times<<endl;}
    void printStu()
    {
        int i;
        cout<<name<<"的学生:"<<endl;
        for(i=0;i<stuNum;i++)
            student[i].printStAll();
    }
    void printTutorAll()
    {
        printTeAll();
        printMT();
        printStu();
    }
};

class ST_Score:public Student
{
private:
    double math;
    double english;
    double getAverScore(){double averScore=(math+english)/2;return averScore;}
public:
    ST_Score(){}                                    //构造方法
    ST_Score(string na,string i,int a,string stn,double ma,double en)
    {
        name=na;
        id=i;
        age=a;
        stuID=stn;
        math=ma;
        english=en;
    }
    ~ST_Score(){cout<<"调用ST_Score的"<<name<<"的析构函数."<<endl;}
    void inputMath(int a){math=a;}
    void inputEnglish(int a){english=a;}
    void printMath(){cout<<"math: "<<math<<endl;}
    void printEnglish(){cout<<"english: "<<english<<endl;}
    void printAverScore(){cout<<"Average Score: "<<getAverScore()<<endl;}
    void printSTSAll()
    {
        printStAll();
        printMath();
        printEnglish();
        printAverScore();
    }
};

int main()
{
    ST_Score st1 = ST_Score("Tina","123456",18,"09876",55,66);
    ST_Score st2 = ST_Score("Tom","34242",18,"2312332",77,88);
    ST_Score st3 = ST_Score("Amy","238173",18,"98798698",99,55);
    st1.printSTSAll();
    cout<<endl;
    st2.printSTSAll();
    cout<<endl;
    st3.printSTSAll();
    cout<<endl;
    Student sts[3]={st1,st2,st3};
    Tutor tut =Tutor("Ben","8937492","计算机科学","09:00","dsfkldsjl",3,sts);
    tut.printTutorAll();
    cout<<endl;
    cout<<"用类的成员函数input()修改类内成员变量的值:"<<endl;
    st1.inputAge(19);
    st1.inputMath(80);
    st1.inputEnglish(90);
    st1.printSTSAll();
    cout<<endl;
    tut.inputDegree("kdjflk");
    tut.inputMT("10:00");
    tut.inputID("12345678");
    tut.printTeAll();
    tut.printMT();
    cout<<endl;
    cout<<"下面演示添加学生操作:"<<endl;
    tut.addStudent();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.声明一个动物基类Animal,私有整型成员变量年龄age,请定义一个派生类Dog,在其成员函数SetAge(int n)中直接给age赋值,测试下看是否会出问题?如何解决? 2.设计一个单基继承的类层次程序,用Person类派生出Student类,增加属性学号index和年级level。Person类中至少有姓名name、年龄age等数据成员,以及构造函数、输出函数等,其余成员函数根据需要添加。在主函数中进行测试。 3.定义一个学生类Student和教师类Teacher,学生类有姓名name、学号index等数据成员,教师类有姓名name、工作证号workID、职称title、课程course、周学时hoursPerWeek等数据成员。再定义一个助教类TeachingAssistant,多继承于学生类和教师类,该类可以使用学生类的全部数据成员,以及教师类的课程和周学时数据成员。要求:每个类提供自定义的构造函数和析构函数,并通过同名函数ShowInfo来显示全部数据成员的值。在主函数中进行测试。 4.声明一个Person,包含姓名name和年龄age等私有数据成员以及相关的成员函数;由它派生出领导类Leader,包含职务position和部门department私有数据成员以及相关的成员函数;再由Person派生出工程师类Engineer,包含职务position和专业speciality私有数据成员以及相关的成员函数;再由Leader和Engineer类派生出主任工程师类Chairman。在主函数中测试各类对象初始化和信息输出,查看是否会出问题?如何解决?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值