C 上机实验报告 实验六
- 格式:docx
- 大小:17.18 KB
- 文档页数:18
实验六多态性1.实验目的1.掌握运算符重载的方法2.学习使用虚函数实现动态多态性2.实验要求1.定义Point类,有坐标_x,_y两个成员变量;对Point类重载“++”(自增)、“――”(自减)运算符,实现对坐标值的改变。
2.定义一个车(vehiele)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
观察虚函数的作用。
3.(选做)对实验4中的People类重载“==”运算符和“=”运算符,“==”运算符判断两个people类对象的id属性是否相等;“=”运算符实现People类对象的赋值操作。
3.实验内容及实验步骤1.编写程序定义Point类,在类中定义整型的私有成员变量_x_y,定义成员函数Point&operator++();Pointoperator++(int);以实现对Point类重载“++”(自增)运算符,定义成员函数Point &operator--();Pointoperator--(int);以实现对Point 类重载“--”(自减)运算符,实现对坐标值的改变。
程序名:1ab8_1.cpp。
2.编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。
再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。
程序名:lab8_2.cpp。
4.思考题1.如何将一个运算符重载为类的成员函数?函数类型operator运算符(形参表){函数体;}2.如何将一个运算符重载为类的友元函数?friend函数类型operator运算符(形参表){函数体;}3.如何实现运行时刻的多态?在基类的成员函数前加上virtual,就可以在它的派生类中声明相同名字和类型的成员函数,在运行过程中,系统会自动判断并调用相应类中的成员函数,从而在调用过程中实现多态。
5.源程序b8_1.cpp#include<iostream>usingnamespacestd;classPoint{private:int_x;int_y;public://构造.析构函数Point(){}Point(int,int);~Point(){}//++.--重载Point&operator++();Pointoperator++(int);Point&operator--();Pointoperator--(int);//输出点坐标voidshowPoint();};Point::Point(intx,inty) {_x=x;_y=y;}Point&Point::operator++() {_x++;_y++;return*this;}PointPoint::operator++(int) {Pointp=*this;++(*this);returnp;}Point&Point::operator--() {_x--;_y--;return*this;}PointPoint::operator--(int){Pointp=*this;--(*this);returnp;}voidPoint::showPoint(){cout<<"Thepointis("<<_x<<","<<_y<<")"<<endl; }intmain(){Pointapoint(3,5);apoint.showPoint();(apoint++).showPoint();//测试后置++apoint.showPoint();(++apoint).showPoint();//测试前置++apoint.showPoint();(apoint--).showPoint();//测试后置--apoint.showPoint();(--apoint).showPoint();//测试前置--apoint.showPoint();return0;}b8_2.cpp#include<iostream>usingnamespacestd;classVehicle{public://基类的成员函数为虚函数virtualvoidrun(){cout<<"Vehicleisrunning!"<<endl;} virtualvoidstop(){cout<<"Vehicleisstopping!"<<endl;} };classBicycle:virtualpublicVehicle//按虚基类继承{public:voidrun(){cout<<"Bicycleisrunning!"<<endl;}voidstop(){cout<<"Bicycleisstopping!"<<endl;}};classMotorcar:virtualpublicVehicle//按虚基类继承{public:voidrun(){cout<<"Motorcarisrunning!"<<endl;} voidstop(){cout<<"Motorcarisstopping!"<<endl;} };classMotorcycle:publicBicycle,publicMotorcar {public:voidrun(){cout<<"Motorcycleisrunning!"<<endl;} voidstop(){cout<<"Motorcycleisstopping!"<<endl;} };intmain(){Vehicleveh;Bicyclebic;Motorcarmot;Motorcyclem;//对象名.函数测试/*veh.run();veh.stop();bic.run();bic.stop();mot.run();mot.stop();m.run();m.stop();*///基类指针测试Vehicle*p;p=&veh;p->run();p->stop();p=&bic;p->run();p->stop();p=&mot;p->run();p->stop();p=&m;p->run();p->stop();return0;}b8_3#include<iostream> #include<cstring>usingnamespacestd;//Date类classDate{private:intyear;intmonth;intday;public:Date();Date(inty,intm,intd);Date(Date&p);~Date();voidsetDate();voidshowDate();};//People类,其中含Date类型的数据classPeople{private:charname[11];charnumber[7];charsex[3];Datebirthday;public:charid[16];People();People(char*n,char*nu,char*s,Dateb,char*i);People(People&p);~People();booloperator==(People&);People&operator=(People&);voidsetName();voidsetNumber();voidsetSex();voidsetId();voidshowPeople();};//Date构造函数Date::Date(){}Date::Date(inty,intm,intd){year=y;month=m;}Date::Date(Date&p){year=p.year;month=p.month;day=p.day;}//析构inlineDate::~Date(){}//Date成员函数,设置出生年月日voidDate::setDate(){inty,m,d;cout<<"Inputtheyear:";cin>>y;cout<<"Inputthemonth:";cin>>m;cout<<"Inputtheday:";cin>>d;year=y;month=m;}//Date内联成员函数,输出年月日inlinevoidDate::showDate(){cout<<"Birthdayis"<<year<<"年"<<month<<"月"<<day<<"日"<<endl;}//People构造函数People::People(){};People::People(char*n,char*nu,char*s,Dateb,char*i){strcpy(name,n);strcpy(number,nu);strcpy(sex,s);birthday=b;strcpy(id,i);}People::People(People&p){strcpy(name,);strcpy(number,p.number);birthday=p.birthday;strcpy(id,p.id);}//People析构inlinePeople::~People(){}//People成员函数,设置各类数据voidPeople::setName(){cout<<"Pleaseinputtheperson'sname:";cin.getline(name,11,'\n');}voidPeople::setNumber(){cout<<"Inputnumber:";cin.getline(number,7,'\n');}voidPeople::setSex(){cout<<"Inputsex:";cin.getline(sex,3,'\n');}voidPeople::setId(){cout<<"Inputid:";cin.getline(id,16,'\n');}//People内联成员函数,输出人员信息inlinevoidPeople::showPeople() {cout<<"Name:"<<name<<endl;cout<<"Number:"<<number<<endl;cout<<"Sex:"<<sex<<endl;cout<<"ID:"<<id<<endl;}boolPeople::operator==(People&p) {returnid==p.id;}People&People::operator=(People&p) {strcpy(name,);strcpy(number,p.number);birthday=p.birthday;strcpy(id,p.id);return*this;}//检测==重载的普通函数voidtest(People&x,People&y){if(strcmp(x.id,y.id)==0){cout<<"Their'sIDsaresame"<<endl;}else{cout<<"Their'sIDsaredifferent"<<endl;}}intmain(){/*inti;charspaceA;//生成3个Date类型的对象Datedate[3]={Date(0,0,0),Date(0,0,0),Date(0,0,0)};//生成3个People类型的对象Peopleperson[3]={People("0","0","0",date[0],"0"),People("0","0","0",date[1],"0"),People("0","0","0",date[2] ,"0")};//设置这3个对象的各类信息for(i=0;i<3;i++){person[i].setName();person[i].setNumber();person[i].setSex();person[i].setId();date[i].setDate();spaceA=getchar();}//输出这3个对象的各类信息for(i=0;i<3;i++){person[i].showPeople();date[i].showDate();}*///测试==重载Dated1(0,0,0);Peoplep1("lizhibo","01","male",d1,"123456");Peoplep2("wangyusen","02","male",d1,"123");Peoplep3("zhouhao","03","male",d1,"123456");test(p1,p2);test(p1,p3);//测试=重载cout<<"Before="<<endl;p1.showPeople();p1=p3;cout<<"After="<<endl;p1.showPeople();return0;}6.运行结果1.2.直接使用对象.函数的形式可以成功调用函数:使用基类指针后出现错误,只能调用基类的成员函数:将基类的成员函数设置成虚函数之后,成功实现调取各个派生类的成员函数:其中在使用Vehicle类型指针指向Motorcycle类型的对象时会出现错误:将Vehicle按照虚基类继承,问题解决。