1、实验六 多态性1. 实验目的1.掌握运算符重载的方法2.学习使用虚函数实现动态多态性2. 实验要求1.定义 Point 类,有坐标_x, _y 两个成员变量;对 Point 类重载 “”(自增)、 “”(自减)运算符,实现对坐标值的改变。2.定义一个车(vehiele)基类,有 Run、Stop 等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从 bicycle 和 motorcar 派生出摩托车(motorcycle)类,它们都有 Run、Stop等成员函数。观察虚函数的作用。3. (选做) 对实验 4 中的 People 类重载“”运算符和 “=”运算符, “
2、”运算符判断两个 people 类对象的 id 属性是否相等; “=”运算符实现 People 类对象的赋值操作。3. 实验内容及实验步骤1.编写程序定义 Point 类,在类中定义整型的私有成员变量_x_y ,定义成员函数 Pointclass Pointprivate:int _x;int _y;public:/构造.析构函数Point()Point(int,int);Point()/+.-重载PointPoint operator +(int);PointPoint operator -(int);/输出点坐标void showPoint();Point:Point(int x,int
3、y)_x=x;_y=y;Point_y+;return *this;Point Point:operator +(int)Point p=*this;+(*this);return p;Point_y-;return *this;Point Point:operator -(int)Point p=*this;-(*this);return p;void Point:showPoint()coutusing namespace std;class Vehiclepublic:/基类的成员函数为虚函数virtual void run()coutrun();p-stop();p=p-run();p
4、-stop();p=p-run();p-stop();p=p-run();p-stop();return 0;3. lab8_3#include#includeusing namespace std;/Date 类class Dateprivate:int year;int month;int day;public:Date();Date(int y,int m,int d);Date(Date Date();void setDate();void showDate();/People 类,其中含 Date 类型的数据class Peopleprivate:char name11;char n
5、umber7;char sex3;Date birthday;public:char id16;People();People(char* n,char* nu,char* s,Date b,char* i);People(People People();bool operator =(PeoplePeoplevoid setName();void setNumber();void setSex();void setId();void showPeople();/Date 构造函数Date:Date()Date:Date(int y,int m,int d)year=y;month=m;day
6、=d;Date:Date(Date month=p.month;day=p.day;/析构inline Date:Date()/Date 成员函数,设置出生年月日void Date:setDate()int y,m,d;couty;coutm;coutd;year=y;month=m;day=d;/Date 内联成员函数,输出年月日inline void Date:showDate()cout“Birthday is “year“年“month“月“day“日“endl;/People 构造函数People:People();People:People(char* n,char* nu,cha
7、r* s,Date b,char* i)strcpy(name,n);strcpy(number,nu);strcpy(sex,s);birthday=b;strcpy(id,i);People:People(People strcpy(number,p.number);birthday=p.birthday;strcpy(id,p.id);/People 析构inline People:People()/People 成员函数,设置各类数据void People:setName()cout“Please input the persons name:“;cin.getline(name,11
8、,n);void People:setNumber()cout“Input number:“;cin.getline(number,7,n);void People:setSex()cout“Input sex:“;cin.getline(sex,3,n);void People:setId()cout“Input id:“;cin.getline(id,16,n);/People 内联成员函数,输出人员信息inline void People:showPeople()cout“Name:“nameendl;cout“Number:“numberendl;cout“Sex:“sexendl;c
9、out“ID:“idendl;bool People:operator =(PeoplePeoplestrcpy(number,p.number);birthday=p.birthday;strcpy(id,p.id);return *this;/检测=重载的普通函数void test(Peopleelsecout“Theirs IDs are different“endl;int main()/*int i;char spaceA;/生成 3 个 Date 类型的对象Date date3=Date(0,0,0),Date(0,0,0),Date(0,0,0);/生成 3 个 People 类
10、型的对象People person3=People(“0“,“0“,“0“,date0,“0“),People(“0“,“0“,“0“,date1,“0“),People(“0“,“0“,“0“,date2,“0“);/设置这 3 个对象的各类信息for(i=0;i3;i+)personi.setName();personi.setNumber();personi.setSex();personi.setId();datei.setDate();spaceA=getchar();/输出这 3 个对象的各类信息for(i=0;i3;i+)personi.showPeople();datei.sh
11、owDate();*/测试=重载Date d1(0,0,0);People p1(“lizhibo“,“01“,“male“,d1,“123456“);People p2(“wangyusen“,“02“,“male“,d1,“123“);People p3(“zhouhao“,“03“,“male“,d1,“123456“);test(p1,p2);test(p1,p3);/测试=重载cout“Before =“endl;p1.showPeople();p1=p3;cout“After =“endl;p1.showPeople();return 0;6. 运行结果1.2.直接使用对象.函数的形式可以成功调用函数:使用基类指针后出现错误,只能调用基类的成员函数:将基类的成员函数设置成虚函数之后,成功实现调取各个派生类的成员函数:其中在使用 Vehicle 类型指针指向 Motorcycle 类型的对象时会出现错误:将 Vehicle 按照虚基类继承,问题解决。3.7. 心得体会学习了解了多态,通过编写程序,进行上机练习,学会了如何利用虚函数实现程序的多态性,进行函数的重载;而且学会了如何对各类运算符进行重载,使得各类运算符满足同类之间的运算,使得程序更加高效;还学会了使用基类指针或引用对基类的派生类中的各类重载函数进行调用,收获很大。