实验6 多态性
来源:互联网 发布:乐谱排版软件 编辑:程序博客网 时间:2024/06/03 07:12
1.实验目的和要求:
(1)理解多态性、虚拟函数、抽象类和具体类、静态绑定和动态绑定等概念
(2)学会利用虚函数来实现多态性,以便更好地来扩展和维护系统
(3)理解C++如何实现虚拟函数和动态绑定(*)
2.实验内容:
(1)以下是一个计算正方体、球体和圆柱体的面积和体积的程序。试分析程序并写出程序的运行结果,然后上机运行验证。
#include<iostream>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<<"输出结果:"<<endl; cout<<"正方体表面积:"<<p->surface_area()<<endl; cout<<"正方体体积:"<<p->volume()<<endl; p=&obj2; cout<<"球体表面积:"<<p->surface_area()<<endl; cout<<"球体体积:"<<p->volume()<<endl; p=&obj1; p=&obj3; cout<<"圆柱体表面积:"<<p->surface_area()<<endl; cout<<"圆柱体体积:"<<p->volume()<<endl; 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<iostream>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<<"TwoDimensionalShape: "; } void print() { cout<<"is a two dimension shape!"<<endl; }};//--------------------三维图像类的定义------------------class ThreeDimensionalShape:public Shape{public: virtual double getArea()=0;//定义计算面积的函数为纯虚函数 virtual double getVolume()=0;//定义计算体积的函数为纯虚函数 void printName() { cout<<"ThreeDimensionalShape: "; } void print() { cout<<"is a three dimension shape!"<<endl; }};//----------------圆类----------------------class Circle:public TwoDimensionalShape{private: double radius;public: Circle(double a)//构造函数 { this->radius=a; } double getArea() //返回圆的面积 { return 3.14*radius*radius; } void printName() { cout<<"Circle "; } void point() { TwoDimensionalShape::print(); cout<<"; Radius="<<radius<<endl; } 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<<"Triangle "; } void point() { TwoDimensionalShape::print(); cout<<"; length="<<length<<",height="<<height<<endl; } 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<<"Square "; } void point() { TwoDimensionalShape::print(); cout<<"; length="<<length<<endl; } 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<<"Sphere "; } void point() { ThreeDimensionalShape::print(); cout<<"; Radius="<<radius<<endl; } 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<<"Square "; } void point() { ThreeDimensionalShape::print(); cout<<"; length="<<length<<endl; } int getcount() { return 3; }};//-----------函数实现--------------------------------------void Pointer1(Shape*); //情况一,指针void Pointer2(Shape&); //情况二,引用//-----------外部函数实现----------------------------------void Pointer1(Shape* baseClassptr){ int i; i=baseClassptr->getcount(); cout<<"----------------------------------"<<endl; baseClassptr->printName(); baseClassptr->print(); //要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape//是TwoDimensionalShape就显示其面积 if(i=2) { cout<<"Area="<<baseClassptr->getArea()<<endl; }//是ThreeDimenionalShape,则显示其面积和体积 else { cout<<"Area="<<baseClassptr->getArea()<<endl; cout<<"Volume="<<baseClassptr->getVolume()<<endl; }}void Pointer2(Shape& baseClassptr){ int i; i=baseClassptr.getcount(); cout<<"----------------------------------"<<endl; baseClassptr.printName(); baseClassptr.print(); //要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape//是TwoDimensionalShape就显示其面积 if(i=2) { cout<<"Area="<<baseClassptr.getArea()<<endl; }//是ThreeDimenionalShape,则显示其面积和体积 else { cout<<"Area="<<baseClassptr.getArea()<<endl; cout<<"Volume="<<baseClassptr.getVolume()<<endl; }}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<iostream>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<<y<<" is not in Set!"<<endl; } 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<<a<<" is not exist!"<<endl; else cout<<a<<" is the "<<tag+1<<"th number in all!"<<endl; } virtual void Print() { ListNode* head=phead;//定义一个指针,并赋值为头指针 if(head==NULL) cout<<"The list is empty!"<<endl; while(head) { cout<<head->num<<" "; head=head->Next; } cout<<endl; } int Listlength()//求得链表的长度 { int i=0; ListNode* head=phead; while(head) { i++; head=head->Next; } cout<<"The length of List is "<<i<<endl; return i; } ListNode* get()//返回链表头结点 { return phead; }};//-----------------------Set类----------------------------class Set : public List{private: static int count;public: ~Set() { count--; } void Insert(int x)//在集合中插入数据,首先判断数据是否已经存在,若是存在则不插入数据 { ListNode* temp; temp=List::get();//指向头结点 int tag=0; while(temp) { if(temp->num==x) { tag=tag+1; cout<<"This number "<<x<<" already exists!"<<endl; break; } temp=temp->Next; } if(tag==0) { List::Insert(x); count++; } } void Remove(int y)//在集合中删除y,调用List的Remove函数,若y在链表中,则删除 { List::Remove(y); count--; } void Find(int z)//查找z值所在位置 { List::Find(z); } void Print()//显示集合中数据 { List::Print(); cout<<"The total number of the data is "<<count<<endl; }};int Set::count=0;int main(){ List* p; Set t; p=&t;//------------插入数据--------------- p->Insert(2); p->Insert(3); p->Insert(4); p->Insert(5);//------------删除数据--------------- p->Remove(8); p->Remove(6); p->Remove(2); p->Insert(6); p->Insert(7);//------------显示数据--------------- p->Print();//------------查找相应的数据--------- p->Find(3);}
- 实验6 多态性
- 6、多态性
- JAVA多态性的实现-java实验报告
- C++小实验之多态性理解
- C++实验题---填空(多态性)
- 多态性
- 多态性
- 多态性!
- 多态性
- 多态性
- 多态性
- 多态性
- 多态性
- 多态性
- 多态性
- 多态性
- 多态性
- 多态性
- c++ 使用new动态的创建指定大小的二维数组
- 从今天开始写博客
- 计算机网络安全基础之<三>
- linux下rt73 usb无线网卡的移植
- 用GDB调试程序
- 实验6 多态性
- 创建一个app流程
- WPF DataTrigger的一个简单实例
- django的views基本代码
- java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
- xcode 4.6 使用NSURLConnection 获取网页内容(iOS6.1,纯手工编码,无xib,无storyboard)
- hdoj 1176免费馅饼(dp)
- ZOJ 2682 People like People(DFS)
- Ubuntu 10.10开启SSH服务