问题 : oop实习- 虚函数

题目描述

利用虚函数实现多态:

  (1)设计Person类,要求具有用于表示姓名的保护数据成员:string szName; 实现信息打印的公有成员函数:void Print()。其中,Print函数设计为虚函数,输出的信息格式为:“Person 姓名”。

  (2)从Person类派生Student类,添加用于表示学号的保护数据成员:int iNumber;重定义用于信息打印的公有成员函数:void Print()。其中,Print函数输出的信息格式为:“Student 姓名 学号”。

  (3)从 Person类派生Teacher类,添加用于表示教龄的保护数据成员:int iYear;重定义用于信息打印的公有成员函数:void Print()。其中,Print函数输出的信息格式为:“Teacher 姓名 教龄”。

  (4)从Student类派生Graduate类,添加用于表示研究方向的保护数据成员:string szResearch;重定义用于信息打印的公有成员函数:void Print()。其中,Print函数输出的信息格式为:“Graduate 姓名 研究方向”。

 

  在main函数中根据用输入的整数动态创建一个Person类的对象指针数组。用户依次输入对象信息(对象类别及其相应的数据成员值),根据对象类别动态创建相应的对象并赋给相应的对象指针数组元素。全部录入后,根据用户输入要显示的对象信息在数组中的位置,调用Print函数在屏幕上打印出相应对象的信息。如果用户输入“exit”,则退出。

输入

对象指针数组的长度;

对象类型及对象信息(输入方式见输入样例);

要显示的对象在数组中的位置;

exit

输出

用户要求显示的对象信息。

样例输入

<span style="color:#333333"><span style="background-color:#f5f5f5">4
Person Zhang
Student Zhao 200905
Graduate Li 200905 DataMining
Teacher Luo 10
0
2
exit</span></span>

样例输出

<span style="color:#333333"><span style="background-color:#f5f5f5">Person Zhang
Graduate Li 200905 DataMining</span></span>

提示

答案:

#include<iostream>
#include<cstring>

#include <cstdlib>
using namespace std;

class Person
{
protected:
    string name_;
public:
    Person(string name)
    {
        name_ = name;
    }
    virtual void Print()
    {
        cout << "Person " << name_ << endl;
    }
};

class Student : public Person
{
protected:
    int number_;
public:
    Student(string name,int n):Person(name),number_(n)
    {

    }
    void Print()
    {
        cout << "Student " << name_ << " " << number_ << endl;
    }
};

class Teacher : public Person
{
protected:
    int year_;
public:
    Teacher(string name,int y):Person(name),year_(y)
    {

    }
    void Print()
    {
        cout << "Teacher " << name_ << " " << year_ << endl;
    }
};

class Graduate : public Student
{
protected:
    string research_;
public:
    Graduate(string name,int n,string r):Student(name,n),research_(r)
    {

    }
    void Print()
    {
        cout << "Graduate " << name_ << " " << number_ << " " << research_ << endl;
    }
};

int main()
{
    int n;
    cin >> n;
    Person** p = new Person*[n];
    int i = 0,snumber,tyear;
    string f,pname,major;
    for(i = 0;i < n;i++)
    {
        cin >> f;
        if(f == "Person")
        {
            cin >> pname;
            p[i] = new Person(pname);
        }
        else if(f == "Student")
        {
            cin >> pname >> snumber;
            p[i] = new Student(pname,snumber);
        }
        else if(f == "Teacher")
        {
            cin >> pname >> tyear;
            p[i] = new Teacher(pname,tyear);
        }
        else if(f == "Graduate")
        {
            cin >> pname >> snumber >> major;
            p[i] = new Graduate(pname,snumber,major);
        }
    }

    string str;
    cin >> str;
    int arr[n],c = 0;

    for(i = 0;i < n;i++)
    {
        if(str == "exit")
        {
            break;
        }
        arr[i] = atoi(str.c_str());
        c++;
        cin >> str;
    }

    for(i = 0;i < c;i++)
    {
        p[arr[i]]->Print();
    }
    return 0;
}

有问题请指出,欢迎大家讨论!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值