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