1.实验目的和要求:
(1)理解多态性、虚拟函数、抽象类和具体类、静态绑定和动态绑定等概念
(2)学会利用虚函数来实现多态性,以便更好地来扩展和维护系统
(3)理解C++如何实现虚拟函数和动态绑定(*)
2.实验内容:
(1)以下是一个计算正方体、球体和圆柱体的面积和体积的程序。试分析程序并写出程序的运行结果,然后上机运行验证。
#include
using namespace std;
class container
{
protected:
double radius;
public:
container(double radius)
{
container::radius=radius;
}
virtual double surface_area()=0;
virtual double volume()=0;
};
class cube:public container
{
public:
cube(double radius):container(radius) {};
double surface_area()
{
return radius*radius*6;
}
double volume()
{
return radius*radius*radius;
}
};
class sphere:public container
{
public:
sphere(double radius):container(radius) {};
double surface_area()
{
return 4*3.1416*radius*radius;
}
double volume()
{
return 3.1416*radius*radius*radius*4/3;
}
};
class cylinder:public container
{
double height;
public:
cylinder(double radius,double height):container(radius)
{
cylinder::height=height;
}
double surface_area()
{
return 2*3.1416*radius*(height+radius);
}
double volume()
{
return 3.1416*radius*radius*height;
}
};
int main()
{
container *p;
cube obj1(10);
sphere obj2(6);
cylinder obj3(4,5);
p=&obj1;
cout<
cout<surface_area()<
cout<volume()<
p=&obj2;
cout<surface_area()<
cout<volume()<
p=&obj1;
p=&obj3;
cout<surface_area()<
cout<volume()<
return 0;
}
/*输出结果:
正方体表面积:600
正方体体积:1000
球体表面积:452.39
球体体积:904.781
圆柱体表面积:226.195
圆柱体体积:251.328
*/
(2)实现下图中的Shape层次结构。每个TwoDimensionalShape类应包括成员函数getArea,以计算二维图形的面积。每个ThreeDimensionalShape类包含成员函数getArea和getVolume,分别计算三维图形的表面积和体积。编写一个程序,使用层次结构中每个具体类的对象的Shape向量指针。程序要打印出向量元素所指的对象。同样,再将所有形状存入向量的循环中,要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape。如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。
#include
using namespace std;
//-----------------类的定义---------------------------
class Shape //是Shape成为包含接口的抽象类
{
public:
virtual double getArea()=0;
virtual double getVolume()=0;
virtual void printName()=0;//定义为纯虚函数,打印对象名
virtual void print()=0;//打印数据成员
virtual int getcount()=0;//返回维数
};
//-----------------二维图像类的定义------------------
class TwoDimensionalShape:public Shape
{
public:
virtual double getArea()=0;//定义计算面积的函数为纯虚函数
virtual double getVolume()
{
return 0;
};
void printName()
{
cout<
}
void print()
{
cout<
}
};
//--------------------三维图像类的定义------------------
class ThreeDimensionalShape:public Shape
{
public:
virtual double getArea()=0;//定义计算面积的函数为纯虚函数
virtual double getVolume()=0;//定义计算体积的函数为纯虚函数
void printName()
{
cout<
}
void print()
{
cout<
}
};
//----------------圆类----------------------
class Circle:public TwoDimensionalShape
{
private:
double radius;
public:
Circle(double a)//构造函数
{
this->radius=a;
}
double getArea() //返回圆的面积
{
return 3.14*radius*radius;
}
void printName()
{
cout<
}
void point()
{
TwoDimensionalShape::print();
cout<
}
int getcount()//返回维数
{
return 2;
}
};
//-----------------三角形类---------------------
class Triangle:public TwoDimensionalShape
{
private:
double length,height;//三角形的底和高
public:
Triangle(double a,double b)
{
this->length=a;
this->height=b;
}
double getArea()//三角形的面积
{
return (length*height)/2;
}
void printName()
{
cout<
}
void point()
{
TwoDimensionalShape::print();
cout<
}
int getcount()//三角形的维数
{
return 2;
}
};
//-------------------正方形--------------
class Square:public TwoDimensionalShape
{
private:
double length;//正方形的
public:
Square(double a)
{
this->length=a;
}
double getArea()//正方形的面积
{
return length*length;
}
void printName()
{
cout<
}
void point()
{
TwoDimensionalShape::print();
cout<
}
int getcount()
{
return 2;
}
};
//-------------定义球类-------------------
class Sphere:public ThreeDimensionalShape
{
private:
double radius;
public:
Sphere(double a)
{
this->radius=a;
}
double getArea()
{
return 4*3.14*radius*radius;
}
double getVolume()
{
return (4*3.14*radius*radius*radius)/3;
}
void printName()
{
cout<
}
void point()
{
ThreeDimensionalShape::print();
cout<
}
int getcount()
{
return 3;
}
};
//---------------定义正方体类-------------------
class Cube:public ThreeDimensionalShape
{
private:
double length;
public:
Cube(double a)
{
this->length=a;
}
double getArea()//计算正方体面积
{
return length*length*6;
}
double getVolume()//计算正方体的体积
{
return length*length*length;
}
void printName()
{
cout<
}
void point()
{
ThreeDimensionalShape::print();
cout<
}
int getcount()
{
return 3;
}
};
//-----------函数实现--------------------------------------
void Pointer1(Shape*); //情况一,指针
void Pointer2(Shape&); //情况二,引用
//-----------外部函数实现----------------------------------
void Pointer1(Shape* baseClassptr)
{
int i;
i=baseClassptr->getcount();
cout<
baseClassptr->printName();
baseClassptr->print();
//要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape
//是TwoDimensionalShape就显示其面积
if(i=2)
{
cout<getArea()<
}
//是ThreeDimenionalShape,则显示其面积和体积
else
{
cout<getArea()<
cout<getVolume()<
}
}
void Pointer2(Shape& baseClassptr)
{
int i;
i=baseClassptr.getcount();
cout<
baseClassptr.printName();
baseClassptr.print();
//要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape
//是TwoDimensionalShape就显示其面积
if(i=2)
{
cout<
}
//是ThreeDimenionalShape,则显示其面积和体积
else
{
cout<
cout<
}
}
int main()
{
//打印所指对象
Shape* pShape;//定义Shape类型的指针
Circle circle(1.0);
Triangle triangle(2.0,3.0);
Square square(4.0);
Sphere sphere(6.0);
Cube cube(7.0);
pShape=&circle;
pShape->printName();
pShape->print();
pShape=▵
pShape->printName();
pShape->print();
pShape=□
pShape->printName();
pShape->print();
pShape=&sphere;
pShape->printName();
pShape->print();
pShape=&cube;
pShape->printName();
pShape->print();
//将所有形状存入向量的循环中
Shape* arrayOfshape[5];
arrayOfshape[0]=&circle;
arrayOfshape[1]=▵
arrayOfshape[2]=□
arrayOfshape[3]=&sphere;
arrayOfshape[4]=&cube;
for(int i=0; i<5; i++)
Pointer1(arrayOfshape[i]);
for(int i=0; i<5; i++)
Pointer2(*arrayOfshape[i]);
}
(3)编写一个程序,先设计一个链表List类,再从链表类派生出一个集合类Set类,再集合类中添加一个记录元素个数的数据项。要求可以实现对集合的插入、删除、查找和显示。
#include
using namespace std;
struct ListNode //结点结构体
{
ListNode* Next;
int num;
};
//-------------------List类-------------------------------
class List
{
private:
ListNode *phead;
public:
List()
{
this->phead=NULL; //构造函数
}
~List()//析构函数
{
while(this->phead)
{
ListNode* temp=phead;
phead=phead->Next;
delete temp;
}
}
virtual void Insert(int a)//初始化并构建链表,头结点为空则首先建立新节点,若不为空则直接插入
{
ListNode* temp;
if(this->phead==NULL)
{
phead=new ListNode;
phead->num=a;
phead->Next=NULL;
}
else
{
temp=new ListNode;
temp->num=a;
temp->Next=phead;
phead=temp;
}
}
virtual void Remove(int y)//将数值为a的节点删除
{
int tag=0;
ListNode* temp;
temp=phead;
while(temp)
{
if(temp->num==y)
{
tag++;
break;
}
temp=temp->Next;
}
//如果tag不等于则说明在链表中有
if(tag!=0)
{
int i;
i=phead->num;
phead->num=temp->num;
temp->num=i;
ListNode* p=phead;
phead=phead->Next;
delete p;
}
else
cout<
}
virtual void Find(int a)//查找值为a的节点所在的位置
{
int tag=0;//位置标志
ListNode* head=phead;//定义一个指针,并赋值为头指针
while(head)
{
if(head->num==a) break;
else
{
tag++;
head=head->Next;
}
}
//return head;//找到a则返回a的位置
if(tag==0||(tag+1)>Listlength())
cout<
else
cout<