c++运算符重载和多态性实验报告
C++多态性实验报告含代码和结果截图
C++多态性实验报告含代码和结果截图实验报告课程:面向对象技术学号:姓名:班级:教师:计算机科学与技术系实验六多态性一、实验目的及要求1.掌握运算符重载的方法;2.掌握使用虚函数实现动态多态性。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容声明一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
观察虚函数的作用。
四、实验结果(附截图)五、总结通过本次实验,我对虚函数、多态性有了进一步了解,对多态性也有了更深的认识,实验中还是有很多的问题不是很清楚,平时要认真学习好理论知识,这样才能在做实验时更好的理解代码,才能更快的改正自己调试时遇到的错误。
六、附录(源程序清单)#includeusing namespace std;int sign=0;class vehicle{vehicle(float m,float w){if(m<240&&m>0)MaxSpeed=m;else{cout<<"汽车超速!"<<endl;< p="">sign=1;return;}if(w<500&&w>0)Weight=w;else{cout<<"汽车超重!"<<endl;< p="">sign=1;return;}cout<<"构造了一个vehicle对象"<<endl;< p="">}virtual void Run() { cout<<"vehicle Run 函数被调用"<<endl;}< p="">virtual void Stop(){ cout<<"vehicle Stop 函数被调用"<<endl<<="">float MaxSpeed;float Weight;}class bicycle:virtual public vehicle{public:bicycle(float h,float m,float w):vehicle(m,w){if(h<1.5&&h>0)Height=h;elsecout<<"自行车超高!"<<endl;< p="">sign=1;return;}cout<<"构造了一个bicycle对象"<<endl;< p="">}void Run() { cout<<"bicycle Run 函数被调用"<<endl;}< p=""> void Stop(){ cout<<"bicycle Stop 函数被调用"<<endl<<endl;}< p="">private:float Height;}class motorcar:virtual public vehicle{public:motorcar(float s,float m,float w):vehicle(m,w){if(s<2&&s>0)SeatNum=s;else{cout<<"摩托车超载!"<<endl;< p="">sign=1;return;}cout<<"构造了一个motorcar对象"<<endl;< p="">}void Run() { cout<<"motorcar Run 函数被调用"<<endl;}< p="">void Stop(){ cout<<"motorcar Stop 函数被调用"<<endl<<endl;}< p="">private:float SeatNum;}class motorcycle:public bicycle,public motorcar{public:motorcycle(float h,float s,float m,float w):bicycle(h,m,w),motorcar(s,m,w),vehi cle(m,w){if(sign==0){cout<<"构造了一个motorcycle对象"<<endl;< p="">}}void Run() { cout<<"motorcycle Run 函数被调用"<<endl;}< p="">void Stop(){ cout<<"motorcycle Stop 函数被调用"<<endl<<endl;}< p="">};void main (){float m,w,h,s;int p;do{sign=0;cout<<"请输入参数:"<<endl<<endl;< p="">cout<<"汽车最高时速(km/h)";cin>>m;cout<<"汽车重量(t)";cin>>w;cout<<"自行车高度(m)";cin>>h;cout<<"摩托车座位(个)";cin>>s;motorcycle car(h,s,m,w);if(sign==0){car.Run();car.Stop();}else{cout<<"1—重新输入2——结束程序";cin>>p;if(p==2)return;elsecout<<endl<<endl;< p=""> }}while(sign==1);}</endl<<endl;<></endl<<endl;<></endl<<endl;}<></endl;}<></endl;<></endl<<endl;}<></endl;}<></endl;<></endl;<></endl<<endl;}<></endl;}<></endl;<></endl;<></endl<</endl;}<></endl;<></endl;<></endl;<>。
C++实验3
4、熟练掌握一般运算符重载的方法。
二、多态与虚函数
1、理解静态连编和动态连编,理解多态的概念。
2、理解虚函数在类的继承层次中的作用及虚函数的引入对程序运行时,能够对使用虚函数的简单程序写出程序结果。
3、了解虚函数对多态性的支持。
4、掌握函数和纯虚函数的概念。
附录
(源程序清单,只要求有必要的关健代码,最好用图说明,一定不要有系统自动生成的代码。代码页数不能超过2页)
2.编写一个时间类Time,包含时、分、秒等数据成员,实现时间的加、减、输入和输出操作。其中加减通过重载相应运算符来实现。
#include<iostream.h>
class Time
{
private:int hour,min,s;
P 37 1.分析以下程序的错误,分析错误原因改正。
2.下面的shape类是一个表示形状的抽象类,area()为求图形面积的函数。请从shape类派生三角形类triangle和圆类circle,并给出具体的求面积函数。
#include<iostream>
Using namespace std;
Class shape
cin>>a>>b>>c;
cout<<"输入圆的半径:";
cin>>r;
triangle trian(a,b,c);
circle cir(r);
trian.disp();
cir.disp();
return 0;
}
注:实验报告一定要双面打印,模板中字体不能改动,填入的正文要求字体是小五号、宋体,行间距是单倍行距。代码可以双行排列。
运算符重载实验报告
运算符重载实验报告运算符重载实验报告引言:运算符重载是C++语言中的一项重要特性,它允许用户自定义运算符的行为。
通过运算符重载,可以使得程序更加直观、简洁,并提高代码的可读性和可维护性。
本实验旨在探索运算符重载的用法和效果。
一、实验目的本实验旨在通过实际操作,深入了解运算符重载的机制和使用方法,以及运算符重载对程序设计的影响。
二、实验环境本实验使用C++编程语言,并在Visual Studio开发环境下进行实验。
三、实验过程1. 了解运算符重载的基本概念运算符重载是指通过定义函数,改变运算符的行为。
在C++中,可以通过重载运算符函数来实现运算符的重载。
运算符重载函数的命名规则为"operator 运算符",例如"operator+"表示重载加法运算符。
2. 实现运算符重载的实验示例为了更好地理解运算符重载的使用方法,我们以矩阵的加法为例进行实验。
首先,定义一个Matrix类,并重载"+"运算符。
```cppclass Matrix {private:int** data;int rows;int cols;public:Matrix(int rows, int cols) {this->rows = rows;this->cols = cols;data = new int*[rows];for (int i = 0; i < rows; ++i) {data[i] = new int[cols];}}Matrix operator+(const Matrix& other) {Matrix result(rows, cols);for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {result.data[i][j] = data[i][j] + other.data[i][j]; }}return result;}};```在上述代码中,我们定义了一个Matrix类,其中包含矩阵的数据成员data、行数rows和列数cols。
C++ 实验三 运算符重载及多态与虚函数
课程实验报告课程名称C++面向对象程序设计班级计算131 实验日期2015/5/21-2015/5/29姓名赵宇涵学号201307012 实验成绩实验名称实验三运算符重载及多态与虚函数实验目的及要求1、理解运算符重载的重要性及好处。
理解静态联编和动态联编,理解多态的概念。
2、理解哪些运算符可以重载而哪些不能重载。
理解虚函数在类的继承层次中的作用及虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。
3、理解单目运算符和双目运算符重载时的特点。
了解虚函数对多态性的支持。
4、熟练掌握一般运算重载的方法。
掌握虚函数和纯虚函数的概念。
5、掌握特殊运算符重载的方法。
理解静态多态性和动态多态性,学习使用虚函数的继承实现动态多态性。
6、了解抽象类的概念。
实验环境VC++6.0/Dev-cpp实验内容1、编写一个时间类Time,包含时、分、秒等数据成员,实现时间的加、减、输入和输出操作。
其中加减通过重载相应运算符来实现。
2、设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,返回t1和t2两个三角形面积之和。
分析提示:在Triangle类中设计一个友元函数operator+(Triangle t1,Triangle t2),它重载运算符“+”,返回t1和t2两个三角形的面积之和。
3、分析程序的错误,分析原因并改正。
4、下面的shape类是一个表示形状的抽象类,area()为求图形面积的函数。
请从shape类派生三角形类(triangle)和圆类(circle),并给出具体的求面积函数。
算法描述及实验步骤1、Timeint hour;int minute;int second;Time(int h=0,int m=0,int s=0):hour(h),minute(m),second(s){}void input();void display();Time operator+(Time t);Time operator-(Time t);2、3、4、Trianglefloat x1;float x2;float x3;float area;Triangle(float a1=0,float a2=0,float a3=0):x1(a1),x2(a2),x3(a3){}float computeArea();friend Triangle operator+(Triangle t1,Triangle t2);void display();Aint x;A(int i){x=i;}virtual void dispa()Bint y;B(int i,int j):A(i){y=j;}void dispa()shapevirtual float area()=0; trianglefloat x1;float x2;float x3;float y;triangle(float a,float b,float c){x1=a;x2=b;x3=c;}float area()circlefloat r;float s;circle(float R){r=R;} float area()调试过程及实验结果1、2、3、4、总结此次试验内容为运算符重载及多态与虚函数。
实验报告多态性
一、实验目的1. 理解多态性的概念及其在面向对象编程中的重要性。
2. 掌握多态性的实现方式,包括方法重载和方法覆盖。
3. 学习如何利用多态性提高代码的可读性和可维护性。
4. 通过实例分析,加深对多态性在实际编程中的应用理解。
二、实验背景多态性是面向对象编程中的一个核心概念,它允许同一个接口(或方法)根据不同的数据类型执行不同的操作。
在Java、C++等面向对象编程语言中,多态性主要通过方法重载和方法覆盖来实现。
三、实验内容1. 方法重载方法重载是指在同一个类中,允许存在多个同名方法,但参数列表不同。
编译器通过参数列表的匹配来确定调用哪个方法。
(1)实验步骤1)创建一个名为“Animal”的类,包含一个方法名为“makeSound”。
2)在“Animal”类中,添加三个重载的“makeSound”方法,分别接受不同类型的参数(如int、String、double)。
3)创建一个名为“Dog”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Woof! Woof!”。
4)创建一个名为“Cat”的类,继承自“Animal”类,并重写“makeSound”方法,使其输出“Meow! Meow!”。
(2)实验结果当创建“Dog”和“Cat”对象时,调用“makeSound”方法会根据对象类型输出相应的声音。
2. 方法覆盖方法覆盖是指在子类中重写父类的方法,使子类的方法具有与父类方法相同的签名,但具有不同的实现。
(1)实验步骤1)创建一个名为“Vehicle”的类,包含一个方法名为“move”,该方法无参数。
2)创建一个名为“Car”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Car is moving”。
3)创建一个名为“Bike”的类,继承自“Vehicle”类,并重写“move”方法,使其输出“Bike is moving”。
(2)实验结果当创建“Car”和“Bike”对象时,调用“move”方法会根据对象类型输出相应的移动信息。
C++程序设计实验报告-多态性
(2)定义一个车(vehiele)基类,有 Run、Stop 等成员函数,由此派生出自 行车(bicycle)类、汽车(motorcar)类,从 bicycle 和 motorcar 派生出摩托车 (motorcycle)类,它们都有 Run、Stop 等成员函数。观察虚函数的作用。 源程序代码:
class bicycle:public vehicle { public:
void run() const{cout<<"bicycle 开始运行"<<endl; void stop() const{cout<<"bicycle 停止运行"<<endl; };
class motorcar:public vehicle { public:
#include<iostream> using namespace std; class Point { public:
Point& operator++(); Point operator++(int); Point& operator--(); Point operator--(int); Point(){_x=_y=0;} int x(){return _x;} int y(){return _y;} private: int _x,_y; };
Point& Point::operator++() {
_x++; _y++; return *this; } Point Point::operator++(int) { Point temp=*this; ++ *this; return temp; } Point& Point::operator--() { _x--; _y--; return *this; } Point Point::operator--(int) { Point temp=*this; -- *this; return temp; }
多态和虚函数、运算符重载
(3)单击标准工作栏的Save按钮,将文件保存到指定地点,并命名。
(4)编译运行。
3、输入并运行程序Ex_Complex的具体步骤如下。
(1) 选择“文件” “关闭工作区间”,关闭原来的项目。
(2) 单击标准工具栏上的“New Text File”按钮,在新打开的文档窗口中输入下列程序代码:#include<iostream.h>class CComplex{public:CComplex(double r=0,double i=0){realPart=r;imagePart=i;}void print(){cout<<"该复数实部="<<realPart<<",虚部="<<imagePart<<endl;}CComplex operator*(CComplex &b);//成员函数重载运算符*friend CComplex operator/(CComplex &a,CComplex &b);友元函数重载运算符private:五、分析与体会:1、象程序设计多态性是面向对象程序设计的重要特征之一,他与封装性和继承性构成了面向对的三大特征。
所谓多态性,是指不同类型的对象接受相同的消息是产生不同的行为。
这里的消息主要是指对类的成员函数的调用,而不同的行为是指成员函数的不同实现。
如:函数重载就是多态的典型例子。
2、此程序中定义了一个抽象类CShape,包含纯虚函数Area和SetData,Area用于计算各个形状的面积,SetData用于重设各个形状的大小。
程序代码中虚函数Area和SetData是通过在基类函数的前面加上virtual关键字来实现的。
程序中ppShape是定义的基类CShape的指针,通过语句ppShape[0]=newTriangle(triWidth,triHeight);ppShape[1]=new(rcWidth,rcHeight); ppShape[2]=new CCircle(r);是将ppShape[0]、ppShape[1]和ppShape[2]分别获得对派生类CTriangle、CRect和CCircle的成员函数的调用,因而语句ppShape[n]->SetData(f1,f2);根据n值的不同调用不同的形状类的area函数,例。
[C++]运算符重载实验报告
+operator+(const COMPLEX &other): COMPLEX+operator-(const COMPLEX &other) : COMPLEX+operator-(): COMPLEX+operator=(const COMPLEX &other) : COMPLEX运行结果2. 程序的类结构图为:Tx,y:int+T(int a,int b)+&operator<<(ostream &os,T &a):friend ostream运行结果3. 程序的类结构图为:Shape+Area():virtual double const+PrintShapeName():virtual void const +Print():virtual void constPointx,y:int+Point(int=0,int=0)+SetPoint(int a,int b):void+GetX():int const+GetY():int const+PointShapeName():virtual void const +Print():virtual void constCircleradius:double+Circle(int x=0,int y=0,double r=0.0) +SetRadius(double r):void+GetRadius():double const+Area():virtual double const+Print():virtual void const+PrintShapeName():virtual void const 运行结果{cout<<'['<<x_size<<","<<y_size<<']'<<", "<<'['<<i_size<<","<<j_size<<']'; }int main(){Circle1 circle(0.0,0.0,3.0);circle.area();circle.perimeter();circle.print();cout<<"\n";Square1 square(0.0,0.0,3.0,3.0);square.area();square.perimeter();square.print();cout<<"\n";cout<<"圆的面积为:"<<circle.area()<<endl;cout<<"圆的周长为:"<<circle.perimeter()<<endl;cout<<"圆的圆心坐标和半径为:";circle.print();cout<<"\n\n";cout<<"正方形的面积为:"<<square.area()<<endl;cout<<"正方形的周长为:"<<square.perimeter()<<endl;cout<<"正方形的中心坐标和一个顶点坐标分别为:";square.print();cout<<"\n";return 0;}运行结果【实例编程】运行结果。
函数的重载实验报告(3篇)
第1篇一、实验目的1. 理解函数重载的概念和原理。
2. 掌握函数重载的使用方法。
3. 通过实验加深对函数重载的理解和应用。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验内容函数重载是指在同一作用域内,允许存在多个名称相同但参数类型或数量不同的函数。
当调用函数时,编译器会根据参数列表的不同来选择合适的函数执行。
1. 实验一:基本函数重载(1)实验目的验证基本函数重载的实现和调用。
(2)实验步骤1)创建一个名为“FunctionOverload”的C++文件。
2)定义两个同名函数,但参数类型不同。
3)在主函数中调用这两个函数,并观察输出结果。
```cppinclude <iostream>using namespace std;void print(int num) {cout << "打印整数:" << num << endl;}void print(double num) {cout << "打印浮点数:" << num << endl;}int main() {print(10);print(3.14);return 0;}```(3)实验结果```打印整数:10打印浮点数:3.14```2. 实验二:重载函数的参数个数(1)实验目的验证重载函数的参数个数对函数调用的作用。
(2)实验步骤1)在“FunctionOverload”文件中添加两个同名函数,但参数个数不同。
2)在主函数中调用这两个函数,并观察输出结果。
```cppvoid print(int num1, int num2) {cout << "打印两个整数:" << num1 << "和" << num2 << endl;}void print(int num) {cout << "打印一个整数:" << num << endl;}int main() {print(1, 2);print(3);return 0;}```(3)实验结果```打印两个整数:1和2打印一个整数:3```3. 实验三:重载函数的参数类型(1)实验目的验证重载函数的参数类型对函数调用的作用。
运算符重载实验报告
一、实验目的1. 理解运算符重载的概念和原理。
2. 掌握C++中运算符重载的方法和规则。
3. 通过实例,实现自定义类型对运算符的重载。
4. 分析运算符重载在实际编程中的应用和优势。
二、实验环境1. 编程语言:C++2. 开发环境:Visual Studio 20193. 操作系统:Windows 10三、实验内容1. 运算符重载的概念和原理2. 运算符重载的方法和规则3. 自定义类型运算符重载实例4. 运算符重载的实际应用四、实验步骤1. 概念和原理运算符重载是指为已有的运算符赋予新的功能,使其能够应用于自定义类型的数据。
在C++中,运算符重载可以通过成员函数或友元函数实现。
2. 方法和规则- 成员函数重载:在自定义类型中定义一个成员函数,该函数的名称与要重载的运算符相同。
- 友元函数重载:在自定义类型外部定义一个友元函数,该函数的名称与要重载的运算符相同,并在函数声明中添加类名和作用域解析运算符。
运算符重载规则:- 运算符重载的函数必须返回与操作数相同的类型。
- 运算符重载的函数不能改变原有运算符的操作数个数。
- 运算符重载的函数不能改变原有运算符的优先级。
- 运算符重载的函数不能改变原有运算符的结合性。
3. 自定义类型运算符重载实例假设我们有一个自定义类型`Point`,表示二维平面上的一个点,其坐标为`(x, y)`。
```cppclass Point {public:int x, y;Point(int x, int y) : x(x), y(y) {}// 成员函数重载加法运算符Point operator+(const Point& p) const {return Point(x + p.x, y + p.y);}// 友元函数重载加法运算符friend Point operator-(const Point& p1, const Point& p2);};// 实现友元函数重载减法运算符Point operator-(const Point& p1, const Point& p2) {return Point(p1.x - p2.x, p1.y - p2.y);}```4. 运算符重载的实际应用运算符重载在实际编程中具有以下优势:- 提高代码可读性:使用自定义类型时,可以像操作基本数据类型一样使用运算符,提高代码的可读性。
c运算符重载和多态性实验报告
实验5 运算符重载和多态性一、实验目的1.掌握用成员函数重载运算符的方法2.掌握用友元函数重载运算符的方法3.理解并掌握利用虚函数实现动态多态性和编写通用程序的方法4.掌握纯虚函数和抽象类的使用二、实验内容1.复数类加减法乘除运算 (用成员函数定义运算符重载)。
复数类的定义:class complex //复数类声明{ public: //外部接口complex(double r=0.0,double i=0.0) //构造函数{real=r,imag=i;}complex operator +(complex c2); //运算符"+"重载成员函数complex operator - (complex c2); //运算符"-"重载成员函数complex operator *(complex ); //运算符"*"重载成员函数complex operator /(complex); //运算符"/"重载成员函数complex operator =(complex c2); //运算符"="重载成员函数void display(); //输出复数private: //私有数据成员double real; //复数实部double imag; //复数虚部};实验代码:#include <iostream>using namespace std;class Complex{public:Complex(){real=0;imag=0;}Complex(double r,double i){real=r;imag=i;}Complex operator+(Complex &c2); Complex operator-(Complex &c2); Complex operator*(Complex &c2); Complex operator/(Complex &c2); void display();private:double real; double imag;};Complex Complex::operator+(Complex &c2) {Complex c;c.real=real+c2.real;c.imag=imag+c2.imag; return c;}Complex Complex::operator-(Complex &c2) {Complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return c;}Complex Complex::operator*(Complex &c2) {Complex c;c.real=real*c2.real-imag*c2.imag;c.imag=imag*c2.real+real*c2.imag; return c;}Complex Complex::operator/(Complex &c2){Complex c;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag );c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);return c;}void Complex::display(){cout<<"("<<real<<","<<imag<<"i)"<<endl;}int main(){Complex c1(4,6),c2(3,7),c3;cout<<"c1=";c1.display();cout<<"c2=";c2.display();int i,j=1;while(j){cout<<"\n";cout<<"\t\t"<<"1.复数之和\n"; cout<<"\t\t"<<"2.复数之差\n"; cout<<"\t\t"<<"3.复数之积\n"; cout<<"\t\t"<<"4.复数之商\n"; cout<<"\t\t"<<"0.退出\n"; cout<<"请选择(0--4)"; cin>>i;switch(i){case 1: c3=c1+c2;cout<<"c1+c2=";c3.display(); break;case 2: c3=c1-c2;cout<<"c1-c2=";c3.display();break;case 3: c3=c1*c2;cout<<"c1*c2=";c3.display();break;case 4: c3=c1/c2;cout<<"c1/c2=";c3.display();break;case 0: j=0;break;}}}测试结果:2.复数类比较运算 (用友元函数定义运算重载)。
C++程序设计运算符重载实验报告
二、实验内容与设计(主要内容,操作步骤、算法描述或程序代码)
本次实验主要实现以下内容:
【项目内容】
定义一个复数类Complex,重载运算符“+”,“-”,“*”,“/”“++”“--”“>”“<”,使之能用于复数的加、减、乘、除、自增、自减、比较大小。运算符重载函数作为Complex类的成员函数。编程序,分别求两个复数之和、差、积、商、自增、自减、比较大小。 提示:注意复数的乘、除法计算。
//重载*
Complexoperator*(Complex a,Complex b){
Complex t;
t.r=a.r*b.r-a.i*b.i;
t.i=b.r*b.i+b.i*b.r;
returnt;
}
//重载/
Complexoperator/(Complex a,Complex b) {
Complex t;
专业:计算机科学与技术年级班级:13计科
学生姓名:侯瑄学号:222013321210092
实验教师:陈睿
计算机与信息科学学院软件学院
实验项目名称
C++程序设计运算符重载
实验时间
2015.10.25
实验类型
□验证性□设计性□综合性
一、实验目的和要求
(1)掌握通过运算符重载实现多态性的方法;
(2)学会运算符重载的成员函数法和友元函数法;
cout<<r;
if(i>0) cout<<"+";
if(i!=0) cout<<i<<"i"<<endl;
C 实验多态性实验报告
class Point { public:
Point(int xx,int yy):x(xx),y(yy) {} void display()const; Point &operator++(); Point operator++(int); Point &operator--(); Point operator--(int); private:
using namespace std;
int Double(int x);
long Double(long x);
float Double(float x);
double Double(double x);
int main()
{ int myInt = 6500;
cout<<Double(myInt)<<endl;
学习使用虚函数实现动态多态性。而虚函数就是在基类中被关键字 virtual 说明,
实 并在派生类中重新定义的函数,且在派生类中重工业新定义时,函数原型,包括返回
类型、函数名、参数个数与参数类型的顺序,都必须与基类中的完全相同。此外,构 验
造函数不能是虚函数,但析构函数可以是虚函数。
总
函数的重载方法有一参数个数相同,但是类型不同;二参数个数不同;三 coust
实
验 Visual C++的编译环境下,独立完成实验要求的内容,独立完成编写、编译以及运行
原
的过程
理
实
验 安装了 Visual C++的 PC 机器
仪
器
C上机实验报告实验六
C上机实验报告实验六 This manuscript was revised by the office on December 22, 2012实验六多态性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()函数,观察其执行情况。
实验7多态性和运算符重载
实验7多态性和运算符重载实验7 运算符重载一、实验目的1.了解多态性;2.掌握算术运算符和关系运算符的重载;3.掌握运算符重载的方法;4.掌握作为成员函数的运算符重载和作为友元函数的运算符重载的不同特点。
二、相关知识1.概念理解多态是指类族中具有相似功能的不同函数使用同一名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。
C++中的多态的实现形式:函数重载、运算符重载、虚函数等。
函数重载是指同一个函数可以操作于不同类型的对象:运算符重载是对已有的运算符赋予多重含义,使用已有运算符对用户自定义类型(比如类)进行运算操作,运算符重载实际上是函数重载;虚函数是实现类族中定义于不同类中的同名成员函数的多态行为。
多态从实现的角度可以分为两类:编译时的多态和运行时的多态,前者是在编译过程中确定了同名操作的具体操作对象,而后者则是在程序运行过程中才动态地确定所针对的具体对象。
这种确定操作的具体对象的过程就是联编。
编译时的多态通过静态联编解决,如函数重载或运算符重载,它们在编译、链接过程中,系统就可以根据类型匹配等特征确定程序中操作调用与执行代码的关系,即确定了某一个同名标识到底要调用哪一段程序代码。
运行时的多态通过动态联编实现,虚函数是实现动态联编的基础,若定义了虚函数就可以通过基类指针或引用实现,执行时会根据指针指向的对象所属的类,决定调用哪个函数。
虚函数具有继承性,其本质不是重载声明而是覆盖。
纯虚函数是在基类中说明的虚函数,它在该基类中可以不给出函数体,要求各派生类根据实际需要编写自己的函数体。
带有纯虚函数的类是抽象类,抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。
2.运算符重载运算符重载是指同样的运算符可以施加于不同类型的操作数上面,使同样的运算符作用于不同类型的数据导致不同类型的行为。
运算符重载的实质就是函数重载。
在实现过程中,首先把指定的运算符表达式转化为对运算符函数的调用,运算对象转化为函数的形参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。
运算符重载—C++课程实验报告
using namespace std; class AB
{
public:
AB(int xx, int yy); void ShowAB(); AB& operator ++(); AB operator ++(int);
AB& operator --();
AB operator --(int);
通过这次实验我基本掌握了通过运算符重载实现多态性的方法学会了运算符重载的成员函数法和友元函数法基本能够区分单目运算符的前置与后置
C++
学生姓
名
xxx
班级
学号
xxxxxxxxx
实验项
目
实验四运算符重载
指导教师
杜之波
实验目
的和要
求
一、实验目的
(1)掌握通过运算符重载实现多态性的方法;
(2)学会运算符重载的成员函数法和友元函数法;
运算后,
A的值为:"
什+AA).ShowAB();
coutvv"
B
的值为:";
(++BB).ShowAB();
cout<v"B=A--运算后,A的值为:";
(--AA).ShowAB();
coutvv"B的值为:";
(BB--).ShowAB();
cout<<"B=--A运算后,A的值为:";
(--AA).ShowAB();
{
AB AA(0,0);
AB BB(0,0);
cout<v"A的值为:";
运算符重载实验报告
RMB::RMB(unsigned int d, unsigned int c)
{
yuan = d;
jf = c;
while ( jf >=100 ){ //以使构造时,确保角分值小于100
yuan ++;
jf -= 100;
}
}
RMB operator+(RMB& s1, RMB& s2) // 此处改为RMB& operator+(RMB& s1, RMB& s2)
private:
unsigned int yuan; //元
unsigned int jf; //角分
};
RMB RMB::interest(double rate)
{
return RMB((yuan + jf / 100.0) * rate);
}
RMB RMB::add(RMB d)
{
return RMB(yuan + d.yuan + jf / 100.0 + d.jf / 100.0);
expense2(x,yrate).display();
}
3.实验结果:
(二)实验题目二:
(2) 将以下程序中重载运算符定义函数的返回类型更改(值返回更改为引用返回,引用
返回更改为值返回),观察程序运行结果,说明原因。
#include<iostream.h>
class RMB{
public:
RMB(unsigned int d, unsigned int c);
学 号:
指导教师:
2013年11月18日
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 运算符重载和多态性班级学号(最后两位)姓名成绩一、实验目的1.掌握用成员函数重载运算符的方法2.掌握用友元函数重载运算符的方法3.理解并掌握利用虚函数实现动态多态性和编写通用程序的方法4.掌握纯虚函数和抽象类的使用二、实验内容1.复数类加减法乘除运算(用成员函数定义运算符重载)。
复数类的定义:class complex //复数类声明{ public: //外部接口complex(double r=0.0,double i=0.0) //构造函数{real=r,imag=i;}complex operator +(complex c2); //运算符"+"重载成员函数complex operator - (complex c2); //运算符"-"重载成员函数complex operator *(complex ); //运算符"*"重载成员函数complex operator /(complex); //运算符"/"重载成员函数complex operator =(complex c2); //运算符"="重载成员函数void display(); //输出复数private: //私有数据成员double real; //复数实部double imag; //复数虚部};实验代码:#include <iostream>using namespace std;class Complex{public:Complex(){real=0;imag=0;}Complex(double r,double i){real=r;imag=i;}Complex operator+(Complex &c2);Complex operator-(Complex &c2);Complex operator*(Complex &c2);Complex operator/(Complex &c2);void display();private:double real; double imag;};Complex Complex::operator+(Complex &c2){Complex c;c.real=real+c2.real;c.imag=imag+c2.imag; return c;}Complex Complex::operator-(Complex &c2){Complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return c;}Complex Complex::operator*(Complex &c2){Complex c;c.real=real*c2.real-imag*c2.imag;c.imag=imag*c2.real+real*c2.imag; return c;}Complex Complex::operator/(Complex &c2){Complex c;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);return c;}void Complex::display(){cout<<"("<<real<<","<<imag<<"i)"<<endl;}int main(){Complex c1(4,6),c2(3,7),c3;cout<<"c1=";c1.display();cout<<"c2=";c2.display();int i,j=1;while(j){cout<<"\n";cout<<"\t\t"<<"1.复数之和\n";cout<<"\t\t"<<"2.复数之差\n";cout<<"\t\t"<<"3.复数之积\n";cout<<"\t\t"<<"4.复数之商\n";cout<<"\t\t"<<"0.退出\n";cout<<"请选择(0--4) ";cin>>i;switch(i){case 1: c3=c1+c2;cout<<"c1+c2=";c3.display();break;case 2: c3=c1-c2;cout<<"c1-c2=";c3.display();break;case 3: c3=c1*c2;cout<<"c1*c2=";c3.display();break;case 4: c3=c1/c2;cout<<"c1/c2=";c3.display();break;case 0: j=0;break;}}}测试结果:2.复数类比较运算(用友元函数定义运算重载)。
注意:1)复数类比较运算按复数的模比较两个复数的大小。
2)复数相等判断当两个复数的实部和虚部都相等,两个复数才相等,否则不相等。
类的定义class complex //复数类声明{public:complex(double r=0.0,double i=0.0){real=r;imag=i;} //构造函数friend int operator> (complex c1,complex c2); //运算符">"重载友元函数friend int operator>=(complex c1,complex c2); //运算符">="重载友元函数friend int operator <(complex c1,complex c2); //运算符"<"重载友元函数friend int operator<=(complex c1,complex c2); //运算符"<="重载友元函数friend int operator ==(complex c1,complex c2); //运算符"=="重载友元函数friend int operator !=(complex c1,complex c2); //运算符"!="重载友元函数void display( ); //显示复数的值private: //私有数据成员double real;double imag;};实验代码:#include"iostream.h"#include"math.h"class complex{public:complex(double r=0.0,double i=0.0){real=r;imag=i;}friend bool operator> (complex c1,complex c2);friend bool operator>=(complex c1,complex c2);friend bool operator< (complex c1,complex c2);friend bool operator<=(complex c1,complex c2);friend bool operator==(complex c1,complex c2);friend bool operator!=(complex c1,complex c2);void display( );private:double real;double imag;};bool operator>(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)>sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator>=(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)>sqrt(c2.real*c2.real+c2.imag*c2.imag)||sqrt(c1.real*c1.r eal+c1.imag*c1.imag)==sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator<(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)<sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator<=(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)<sqrt(c2.real*c2.real+c2.imag*c2.imag)||sqrt(c1.real*c1.r eal+c1.imag*c1.imag)==sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator==(complex c1,complex c2){if(c1.real==c2.real&&c1.imag==c2.imag)return true;elsereturn false;}bool operator!=(complex c1,complex c2){if(c1.real!=c2.real||c1.imag!=c2.imag) return true;elsereturn false;}void complex::display(){cout<<"("<<real<<","<<imag<<"i)";}void compare(complex &c1,complex &c2){if(operator>(c1,c2)==1){c1.display();cout<<">";c2.display(); cout<<endl;} if(operator>=(c1,c2)==1){c1.display();cout<<">=";c2.display(); cout<<endl;} if(operator<(c1,c2)==1){c1.display();cout<<"<";c2.display(); cout<<endl;} if(operator<=(c1,c2)==1){c1.display();cout<<"<=";c2.display(); cout<<endl;} if(operator==(c1,c2)==1){c1.display();cout<<"=";c2.display(); cout<<endl;} if(operator!=(c1,c2)==1){c1.display();cout<<"!=";c2.display(); cout<<endl;} cout<<endl; }int main() {complex c1(2,3),c2(3,4),c3(3,4);cout<<"c1=";c1.display();cout<<endl;cout<<"c2=";c2.display();cout<<endl;cout<<"c3=";c3.display();cout<<endl;compare(c1,c2);compare(c1,c3);compare(c2,c3);return 0;}测试结果:3.利用虚函数实现的多态性来求四种几何图形的面积之和。