C++虚函数virtual function

  这是为女友总结的,女友的专业是网络工程;只是,到目前为止,我遇到的女生在编程敲代码方面的强人,真的是少之又少!这里所遇到的问题详细描述大致如下:

 写一个People类,包含构造函数,输入、输出信息函数,数据成员有姓名、编号(可以理解成学号或身份证号吧,我选择的是学号,且为int型)、性别;

    一个Studnet类,继承自People类,增加新的数据成员学生成绩;一个Teacher类,继承自People类,只增加新的数据成员教师的教龄。

    还有,我一直很诧异为什么现在还有大学在选择C++ IDE的时候还是用Visual C++6.0,不知道Visual C++6.0对C++标准的支持实在是太差了;Visual C++ 6.0可是

十几年前的东西呀!所以下面我所贴的代码在VC++6.0中肯定是无法编译通过的。可以选择IDE的是code::blocks10.05、mingw developer studio或是visual studio 2010等!

包含mylove.h头文件(头文件内容如下),在主函数中调用函数void Test(void)即可,或者将void Test(void)改成主函数即可!

#ifndef MYLOVE_H_INCLUDED
#define MYLOVE_H_INCLUDED
#include <iostream>
#include <string>

///class People/
class People
{
public:
    People(string nam = "null",int num = 0,string se = "null"):
        name(nam),number(num),sex(se) {}//constructed function
    virtual void InputMseeages(string nam,int num,string se){
        name = nam,number = num,sex = se;
    }//input messages method
    virtual void OutputMessages() const{
        cout<<"Name:"<<name<<" Number:"<<number<<" Sex:"<<sex<<endl;
    }//output messages method
protected:
    string name;  //name
    int number;   //number
    string sex;   //sex
};///end class People


///class Student/
class Student : public People
{
public:
    Student(string nam = "null",int num = 0,string se = "null",double gra = 0):
        People(nam,num,se),grade(gra) {}//constructed function
    void InputMseeages(string nam,int num,string se,double gra){
        name = nam,number = num,sex = se,grade = gra;
    }//input messages method
    void OutputMessages() const{
        cout<<"Name:"<<name<<" Number:"<<number<<" Sex:"<<sex<<" Grade:"<<grade<<endl;
    }//output messages method
private:
    double grade;
};///end class Student

///class Teacher/
class Teacher : public People
{
public:
    Teacher(string nam = "null",int num = 0,string se = "null",int yea = 0):
        People(nam,num,se),year(yea) {}//constructed function
    void InputMseeages(string nam,int num,string se,int yea){
        name = nam,number = num,sex = se,year = yea;
    }//input messages method
    void OutputMessages() const{
        cout<<"Name:"<<name<<" Number:"<<number<<" Sex:"<<sex<<" Year:"<<year<<endl;
    }//output messages method
private:
    int year;
};///end class Teacher

/**
  *main function--Only test--
  */
void Test(void)
{
    cout<<"class People:"<<endl;
    People P("JiangTing",2145,"girl");
    P.OutputMessages();
    P.InputMseeages("LiYang",2140,"boy");
    P.OutputMessages();

    cout<<"class Student:"<<endl;
    Student S("JiangTing",2145,"girl",0);
    S.OutputMessages();
    S.InputMseeages("LiYang",2140,"boy",100);
    S.OutputMessages();

    cout<<"class Teacher:"<<endl;
    Teacher T("JiangTing",2145,"girl",0);
    T.OutputMessages();
    T.InputMseeages("LiYang",2140,"boy",0);
    T.OutputMessages();
}//end test

#endif // MYLOVE_H_INCLUDED
 效果图:如下


 

其实,我也有过类似的题目,不过要比前面的复杂多了,具体信息如下:

实验题目(共2题, 第1题)

标题:1、虚函数
时 限:1000 ms
内存限制:10000 K
总时限:3000 ms
描述:

1.设计Person类。保护成员:姓名string Name; 公有成员函数:void Print(); 构造函数。

2.从Person类派生Student类。保护成员:学号int Number;公有成员函数:void Print(); 构造函数。

3.从 Person类派生 Teacher类。保护成员:教龄int Year;公有成员函数:void Print();构造函数。

4.从Student类派生Graduate类。保护成员:研究方向string Research;公有成员函数:void Print();构造函数。

在主程序中定义一个Person类的对象指针数组,长度由用户输入。而后,用户依次输入对象信息(对象类别及其包含的成员)。全部录入后,由用户输入要显示的对象信息在数组中的位置,并在屏幕上打印,如果用户输入”exit”则退出。

输入:

指针数组长度;

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

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

exit。

输出:

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

输入样例:

4

Person Zhang

Student Zhao 200905

Graduate Li 200905 DataMining

Teacher Luo 10

0

2

exit

输出样例:

Person Zhang

Graduate Li 200905 DataMining

提示:

基类的成员函数Print()定义成虚函数。

解决代码如下:

 

#include <iostream>

using namespace std;
#include <string>
#include <cstdlib>
class Person
{
protected:
    string Name;
public:
    Person(string Name = "\0")
    {
        this->Name = Name;
    }
    virtual void Print()
    {
        cout<<"Person "<<Name<<endl;
    }
};

class Student : public Person
{
protected:
    int Number;
public:
    Student(int Number = 0,string Name = "\0"):Person(Name)
    {
        this->Number = Number;
    }
    virtual void Print()
    {
        cout<<"Student "<<Name<<' '<<Number<<endl;
    }
};

class Teacher : public Person
{
protected:
    int Year;
public:
    Teacher(int Year = 0,string Name = "\0"):Person(Name)
    {
        this->Year = Year;
    }
    virtual void Print()
    {
        cout<<"Teacher "<<Name<<' '<<Year<<endl;
    }
};

class Graduate : public Student
{
protected:
    string Research;
public:
    Graduate(string Research = "\0",string Name = "\0",int Number = 0)
        :Student(Number,Name)
    {
        this->Research = Research;
    }
    void Print()
    {
        cout<<"Graduate "<<Name<<' '<<Number<<' '<<Research<<endl;
    }
};

int main()
{
    int length;
    cin>>length;

    Person* *p = new Person*[length];
    for(int i = 0; i < length; ++i)
    {
        string obj_Name;
        string Name,Research;
        int Number,Year;

        cin>>obj_Name;
        if(obj_Name == "Person")
        {
            cin>>Name;
            p[i] = new Person(Name);
        }
        else if(obj_Name == "Student")
        {
            cin>>Name>>Number;
            p[i] = new Student(Number,Name);
        }
        else if(obj_Name == "Teacher")
        {
            cin>>Name>>Year;
            p[i] = new Teacher(Year,Name);
        }
        else if(obj_Name == "Graduate")
        {
            cin>>Name>>Number>>Research;
            p[i] = new Graduate(Research,Name,Number);
        }
        else
        {
            exit(EXIT_FAILURE);
        }
    }
    while(true)
    {
        string strTemp;
        cin>>strTemp;
        if(strTemp == "exit")
            break;
        int index = atoi(strTemp.c_str());
        if(index < 0 || index >= length)
            break;
        p[index]->Print();
    }

    for(int i = 0; i < length; ++i)
        delete p[i];
    delete p;

    return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值