C++虚函数virtual function

来源:互联网 发布:lync for mac 2016 编辑:程序博客网 时间:2024/05/16 12:28
  这是为女友总结的,女友的专业是网络工程;只是,到目前为止,我遇到的女生在编程敲代码方面的强人,真的是少之又少!这里所遇到的问题详细描述大致如下:

 写一个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 methodprotected:    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 methodprivate:    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 methodprivate:    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;}


 

原创粉丝点击