- 实验目的和要求
(1)进一步熟悉累的设计,运用继承与派生机制设计派生类,合理设置数据成员和成员函数。
(2)掌握双目运算符、单目运算符的重载方法,对常用算数运算符能在自定义类中通过友元函数、成员函数进行重载,以实现静态多态性。
(3)掌握通过继承、虚函数、基类的指针或引用实现动态多态性。
(4)理解并掌握有纯虚函数的抽象类的作用,在各派生类中重新定义纯虚函数的方法,并实现动态多态性。
实验原理及内容
实验题目(1)【见实验教材实验五的题目1】: 定义Point类,在该类中包含如下内容:
1)私有数据成员:
double x; //x轴坐标
double y; //y轴坐标
2)共有成员函数:
构造函数 //默认值为原点(0.0,0.0)
Point operator++(); //成员函数重载前置“++”
Point operator-(const Point &a); //成员函数重载运算符“-”
friend Point operator+(const Point &a,const Point &b); //友元函数重载“+”
friend Point operator+(const Point &a,double b); //友元函数重载“+”
friend ostream & operator <<(ostream & out,const Point & obj); //友元函数重载“<<”
给出主函数如下:
int main()
{
Point p1(10,30),p2(-18,0),p3;
cout<<"初始坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
p3=p1+p2;
cout<<"执行p3=p1+p2后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
p3=p3+20;
cout<<"执行p3=p3+20后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
p2=p3-p1;
cout<<"执行p2=p3-p1后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
++p2;
cout<<"执行++p2后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
return 0;
}
#include<iostream>
using namespace std;
class Point {
private:
double x;
double y;
public :
Point(double m = 0.0,double n=0.0){
x = m;
y = n;
}
Point operator++();
Point operator-(const Point& a);
friend Point operator +(const Point& a, const Point& b);
friend Point operator+(const Point& a, double b);
friend ostream& operator <<(ostream& out, const Point& obj);
};
Point Point::operator++() {
++x;
++y;
return *this;
}
Point Point::operator-(const Point& a) {
Point reduce;
reduce.x =x-a.x;
reduce.y =y-a.y;
return reduce;
}
Point operator+(const Point& a, const Point& b){
Point puls;
puls.x =(a.x+b.x);
puls.y =(a.y+b.y);
return puls;
}
Point operator+(const Point& a, double b) {
Point puls1;
puls1.x += a.x+b;
puls1.y += a.y+b;
return puls1;
}
ostream& operator <<(ostream& out, const Point& obj) {
out << "(" << obj.x << "," << obj.y << ")";
return out;
}
int main(){
Point p1(10,30),p2(-18,0),p3;
cout<<"初始坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
p3=p1+p2;
cout<<"执行p3=p1+p2后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
p3=p3+20;
cout<<"执行p3=p3+20后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
p2=p3-p1;
cout<<"执行p2=p3-p1后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
++p2;
cout<<"执行++p2后,坐标点p1,p2,p3为:";
cout<<p1<<" "<<p2<<" "<<p3<<endl;
return 0;
}
运行结果如下:
实验题目(2)【见实验教材实验五的题目2】:定义一个抽象类容器,其中定义若干纯虚函数,实现求表面积、体积、输出等功能。
参考代码如下:
#include<iostream>
using namespace std;
class Container{
protected:
double radius;
public:
Container(double r)
{
radius = r;
}
virtual double area() = 0;
virtual double volume() = 0;
virtual void print() = 0;
};
class Cube : public Container //立方体类,从Container公有继承
{ //定义Cube类的成员函数:表面积和体积
public:
//构造函数
Cube(double r) : Container(r) {}
double area() //重新定义求面积函数
{
return 6 * radius * radius;
}
double volume() //重新定义求体积函数
{
return radius * radius * radius;
}
void print() //重新定义求打印函数
{
cout <<"Cube area=" <<area() << " Cube volum="<<volume() << endl;
}
};
class Sphere : public Container //球类,从Container公有继承
{
//定义Sphere类的成员函数:表面积和体积
public:
//构造函数
Sphere(double r) : Container(r) {}
double area() //重新定义求面积函数
{
return 4 * 3.14 * radius * radius;
}
double volume() //重新定义求体积函数
{
return (4 * 3.14 * radius * radius) / 3;
}
void print() //重新定义求打印函数
{
cout <<"Sphere area="<< area() << " Sphere volume="<<volume() << endl;
}
};
class Cylinder : public Container //圆柱体类,从Container公有继承
{
//定义Cylinder类的成员函数:表面积和体积
public:
//构造函数
Cylinder(double r) : Container(r) {}
double area() //重新定义求面积函数
{
return 2*3.14*radius*radius+2*3.14*radius;
}
double volume() //重新定义求体积函数
{
return 3.14 * radius * radius*radius;
}
void print() //重新定义求打印函数
{
cout << "Cylinder area="<<area() << " Cylinder volum="<<volume() << endl;
}
};
int main(){
Container* p;
Cube c1(1.0);
Sphere s1(1.0);
Cylinder c2(1.0);
p = &c1;
cout << p->area() << endl;
cout << p->volume() << endl;
p->print();
p = &s1;
cout << p->area() << endl;
cout << p->volume() << endl;
p->print();
p = &c2;
cout << p->area() << endl;
cout << p->volume() << endl;
p->print();
return 0;
}