要求
(1)掌握C++中运算符重载的机制和运算符重载的方式;
(2)理解类型转换的必要性,掌握类型转换的使用方法;
(3)理解多态性,掌握虚函数的设计方法;
(4)掌握纯虚函数和抽象类的使用方法。
- 定义point类,有坐标x,y两个数据成员,对point类重载“++”(自增),–(自减)运算符,实现对坐标值的改变。
#include<bits\stdc++.h>
using namespace std;
class Point
{
protected:
int x,y;
public:
Point(int a,int b):x(a),y(b){};
Point &operator ++(int)
{
x+=1;
y+=1;
return *this;
}
Point &operator --()
{
x-=1;
y-=1;
return *this;
}
void show()
{
cout<<x<<","<<y<<endl;
}
};
int main()
{
Point p1(2,3);
p1.show();
p1++;
p1.show();
--p1;
p1.show();
system("pause");
return 0;
}
- 声明一个车(Vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(Bicycle)类、汽车(car)类,从自行车和汽车类派生出摩托车(Motorcycle)类,它们都有Run()、Stop()等成员函数。利用纯虚函数和抽象类解决问题。(注意和实验三第(2)题实现方法的区别,考察动态连编和静态连编的不同实验结果)
#include<bits\stdc++.h>
//纯虚函数,和抽象类
using namespace std;
class Vehicle
{
public:
virtual void Run()=0;
virtual void Stop()=0;
};
class Bicycle:public Vehicle
{
public:
virtual void Run()
{
cout<<"Bicycle Run"<<endl;
}
virtual void Stop()
{
cout<<"Bicycle Stop"<<endl;
}
};
class Car:public Vehicle
{
public:
virtual void Run()
{
cout<<"Car Run"<<endl;
}
virtual void Stop()
{
cout<<"Car Stop"<<endl;
}
};
class Motorcycle:public Bicycle,public Car
{
public:
virtual void Run()
{
cout<<"Motorcycle Run"<<endl;
}
virtual void Stop()
{
cout<<"Motorcycle Stop"<<endl;
}
};
int main()
{
Bicycle a1;
Car a2;
Motorcycle a3;
Vehicle *p;
p=&a1;
p->Run();
p->Stop();
p=&a2;
p->Run();
p->Stop();
Motorcycle*p1;
p1=&a3;
p1->Run();
p1->Stop();
p->Run();
system("pause");
return 0;
}
- 声明一个shape基类,有计算面积arae()成员函数,由此派生出正方形类(Square)、直角三角形类(Triangle)、圆类(Circle),它们都有arae()成员函数。利用虚函数编程计算正方形、直角三角形和圆的面积之和。
#include<bits\stdc++.h>
using namespace std;
class shape
{
public:
double areaS;
void area(double a)
{
areaS=a;
cout<<areaS<<endl;
}
};
class Square:virtual public shape
{
protected:
double area1;//正方形的面积
};
class Triangle:virtual public shape
{
protected:
double area2;//三角形的面积
};
class Circle:virtual public shape
{
protected:
double area3;//圆的面积
};
class All:public Square,public Triangle,public Circle
{
public:
All(double a,double b,double c)
{
Square::area1=a;
Triangle::area2=b;
Circle::area3=c;
areaS=Square::area1+Triangle::area2+Circle::area3;
}
};
int main()
{
All a1(10.0,11.1,12.4);
a1.area(a1.areaS);
system("pause");
return 0;
}
注意
- 注意为了防止继承过程二义性出现而报错,对于继承时要虚继承;2.重载运算符,前置自加operator不需要参数,而后置自加需要有int类型参数,不过不需要给出具体变量;
- 多态的实现,需要用到基类的定义的指针变量,传入派生类地址来实现多态;
- 多态是方法的多态,属性没有多态