实验4 多态性实验

本篇博客介绍了三个C++编程实验,涉及运算符重载、虚函数和多态性。实验1通过Point类实现坐标值的增减操作;实验2创建People类,包含人员信息,并重载“==”运算符比较身份证号;实验3通过Vehicle基类及其派生类展示虚函数在多态中的应用。实验展示了C++在面向对象编程中的关键特性。
摘要由CSDN通过智能技术生成

实验4  多态性实验

1、实验目的

(1)掌握运算符重载的基本方法;

(2)掌握虚函数的定义和使用方法;

(3)掌握纯虚函数和抽象类的概念和用法。

2、实验学时:6学时

3、实验内容

(1)声明Point类,有坐标x、y两个成员变量;对类重载++和--运算符,实现坐标值的改变。

#include<iostream>
using namespace std;
class Point
{
    private:
        int x,y;
    public:
        Point();
        Point (int x1,int y1);//输入
        void out();//输出
        Point &operator ++(int);//前置
        Point &operator --(int);
        Point &operator ++();//后置
        Point &operator --();
};
Point::Point()
{
}
Point::Point(int x1,int y1)
{
    x=x1;
    y=y1;
}

Point &Point::operator ++(int)
{
    x++;
	y++;
	return *this;
}

Point &Point::operator --(int)
{
    x--;
    y--;
    return *this;
}

Point &Point::operator ++()
{
    ++x;
    ++y;
    return *this;
}

Point &Point::operator --()
{
    --x;
    --y;
    return *this;
}

void Point::out()
{
    cout<<"("<<x<<","<<y<<")"<<endl;
}
int main()
{
    Point p1(3,4);
    ++p1;
    p1.out();
    --p1;
    p1.out();
    p1++;
    p1.out();
    p1--;
    p1.out();
    system("pause");
    return 0;
}

(2)声明一个People(人员)类,具有属性如下:number(编号)、name(姓名)、sex(性别)、birthday(出生日期)、id(身份证号)。其中“出生日期”是一个子对象(请自行设计日期类)。用成员函数实现对人员信息的录入和显示。在主函数中定义People类的对象数组,录入数据并显示。同时为People重载运算符“==”,运算符“==”为判断两个People对应的id属性是否相同。

/*声明一个People(人员)类,具有属性如下:
number(编号)、name(姓名)、sex(性别)、birthday(出生日期)、id(身份证号)。
其中“出生日期”是一个子对象(请自行设计日期类)。用成员函数实现对人员信息的录入和显示。
在主函数中定义People类的对象数组,录入数据并显示。
同时为People重载运算符“==”,运算符“==”为判断两个People对应的id属性是否相同。*/
#include<iostream>
#include<string>
using namespace std;
//birthday类
class birthday
{
    private:
        int year,month,day;
    public:
        birthday();//无参构造函数
        birthday(int y,int m,int d);//有参构造函数
        int get_date();//输入出生日期
        void out_date();//输出出生日期
};
//无参构造函数
birthday::birthday()
{}
//有参构造函数
birthday::birthday(int y,int m,int d)
{
    year=y;
    month=m;
    day=d;
}
//输入出生日期
int birthday::get_date()
{
    cout<<"输入出生日期:";
    cin>>day>>month>>year;
}
//输出出生日期
void birthday::out_date()
{
    cout<<"输入出生日期:"<<year<<"."<<month<<"."<<day<<endl;
}
//People类,公有继承birthday类
class People:public birthday
{
    public :
        string number;
        string name;
        string sex;
        int id; 
        int day;
        int month;
        int year;
    public:
        People();//无参构造函数
        People(int year,int month,int day,string num,string nam,string s,int i):birthday(year,month,day)
        {
        	number=num;
        	name=nam;
        	sex=s;
        	id=i;
		};//有参构造函数
        int get();//输入
        void out();//输出
        friend People &operator==(People &p1,People &p2);//友元函数实现双目运算符重载
};
//无参构造函数
People::People()
{
}
//输入
int People::get()
{
    cout<<"编号";
    cin>>number;
    cout<<"姓名";
    cin>>name;
    cout<<"性别";
    cin>>sex;
    birthday::get_date();
    cout<<"身份证号";
    cin>>id;
    return 0;
}
//重载运算符==
People &operator==(People &p1,People &p2)
{
    if(p2.id==p1.id)
    {
       cout<<"这两个的id相等"<<endl;;
    }
    else  cout<<"这两个的id不相等"<<endl;;
}
//输出
void People::out()
{
    cout<<"编号:"<<number<<endl;
    cout<<"姓名:"<<name<<endl;
    cout<<"性别:"<<sex<<endl;
    out_date();
    cout<<"身份证号:"<<id<<endl;
}
int main()
{
    People p1(1,1,1,"1212","sqs","boy",341125),p2;
    p2.get();
    p1.out();
    p2.out();
    p1==p2;//判断p1和p2的id是否相等
    return 0;
}

(3)声明一个车Vehicle基类,有run、stop等成员函数,由此派生出自行车Bicycle类、汽车Motorcar类,从Bicycle、Motorcar类派生出摩托车Motorcycle类,它们都有run、stop等成员函数,观察虚函数的作用。

#include<iostream>

using namespace std;  

class Vehicle{

  public : 

    void Run(){cout<<"Vehicle Run!"<<endl;} 

       void Stop(){cout<<"Vehicle Stop!"<<endl;} 

};   

class Bicycle: virtual public Vehicle{                  //去掉virtual

  public:      

         void Run(){cout<<"Bicycle Run!"<<endl; }    

        void Stop(){cout<<"Bicycle Stop!"<<endl; }

};   

class Motorcar:  virtual public Vehicle{               //去掉virtual

  public:     

       void Run(){cout<<"Motorcar Run!"<<endl;}    

       void Stop(){cout<<"Motorcar Stop!"<<endl;}  

};   

class Motorcycle: public Bicycle,public Motorcar{

  public:     

       void Run(){cout<<"Motorcycle Run!"<<endl;}    

       void Stop(){cout<<"Motorcycle Stop!"<<endl;} 

};  

void display(Vehicle *ptr)

      {  ptr->Run();  ptr->Stop();    

       cout<<endl;   }  

void main()

{ Motorcycle ob;

  ob.Run();

  ob.Stop();

  display(&ob);

}

  • 观察运行结果。
  • 上面去掉virtual 结果如何?
  • 将    void Run(){cout<<"Vehicle Run!"<<endl;} 

         void Stop(){cout<<"Vehicle Stop!"<<endl;}

改为:virtual void Run(){cout<<"Vehicle Run!"<<endl;} 

         virtual void Stop(){cout<<"Vehicle Stop!"<<endl;}

   运行结果如何?想想为什么?

由于bicycle与motorcar都继承了同一个基类,所以必须使用虚继承,不会出现二义性,不会报异常的错误。

 推荐几款学习编程的网站

免费在线开发平台(https://docs.ltpp.vip/LTPP/

        探索编程世界的新天地,为学生和开发者精心打造的编程平台,现已盛大开启!这个平台汇集了近4000道精心设计的编程题目,覆盖了C、C++、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3以及C#等众多编程语言,为您的编程学习之旅提供了一个全面而丰富的实践环境。

        在这里,您不仅可以查看自己的代码记录,还能轻松地在云端保存和运行代码,让编程变得更加便捷。平台还提供了私聊和群聊功能,让您可以与同行们无障碍交流,分享文件,共同进步。不仅如此,您还可以通过阅读文章、参与问答板块和在线商店,进一步拓展您的知识边界。

        为了提升您的编程技能,平台还设有每日一题、精选题单以及激动人心的编程竞赛,这些都是备考编程考试的绝佳资源。更令人兴奋的是,您还可以自定义系统UI,选择视频或图片作为背景,打造一个完全个性化的编码环境,让您的编程之旅既有趣又充满挑战。

免费公益服务器(https://docs.ltpp.vip/LTPP-SHARE/linux.html

        作为开发者或学生,您是否为搭建和维护编程环境而困扰?现在,有一款免费的公共服务器,内置多种编程语言的编程环境,并且配备了在线版VS Code。让您可以随时随地在线写代码,无需复杂配置,专注于开发和学习。(PS:毕竟是免费公共的服务器,任何人都能够使用,为了数据隐私和安全,请勿上传重要数据,仅用于学习)

免费公益MYSQL(https://docs.ltpp.vip/LTPP-SHARE/mysql.html

        作为一名开发者或学生,您是否常常为数据库环境的搭建而烦恼?是否因为预算有限而无法使用高性能的数据库服务?现在,有一款免费的MySQL服务器,专为开发者和学生量身打造,让你轻松无忧地进行开发和学习!内置在线phpmyadmin管理面板,方便用户查看数据。(PS:毕竟是免费公共的MYSQL,任何人都能够使用,为了数据隐私和安全,请勿上传重要数据,仅用于学习)

免费在线WEB代码编辑器(https://docs.ltpp.vip/LTPP-WEB-IDE/

        无论你是开发者还是学生,编程环境的搭建和管理可能会占用你宝贵的时间和精力。现在,有一款强大的免费在线代码编辑器,支持多种编程语言,让您可以随时随地编写、调试和运行代码,提升编程效率,专注于创意和开发。

免费二维码生成器(https://docs.ltpp.vip/LTPP-QRCODE/

        无论是企业宣传、活动推广,还是个人信息分享,二维码都是一种快速、高效的信息传递方式。现在,有一款功能强大的二维码生成器,不仅易于使用,还具备多种便捷功能,帮助您更轻松地生成和管理二维码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WA-自动机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值