zoukankan      html  css  js  c++  java
  • 实验6 多态性

    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);
    }
    


  • 相关阅读:
    IOS基于 fmdb数据库 的简单操作应用
    App 上线被拒绝的原因有哪些?
    cocoaPods的安装以及使用
    IOS开发工程师的近期面试题
    UIButton基本介绍
    UIView 详解
    使用 Paros 抓接口
    如何在main方法中创建50000次对象
    如何将将String 转换 int
    2020年09月24号--测试登录账号15分钟有效时长
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3086149.html
Copyright © 2011-2022 走看看