第十三週項目3:立體類族共有的抽象類

問題及代碼:

/*
*Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*文件名稱:project.cpp
*作    者:陳文青
*完成日期:2015年6月6日
*版 本 號:v1.0
*
*問題描述:設計一個抽象類CSolid,含有用於求表面積及體積的兩個純虛函數。
設計派生類CCube、CBall、CCylinder,分別表示正方體、球體及圓柱體。
在main()函數中,定義CSolid *p;(p是指向基類的指針,且這個基類是個抽象類)。
要求利用這個p指針,能夠求出正方體、球體及圓柱體對象的表面積及體積。
*程序輸入:
*程序輸出:
*/
#include<iostream>
using namespace std;
//定義虛基類
class CSolid
{
public:
    virtual double get_area() =0;    //關於表面積的純虛函數
    virtual double get_volume() =0;    //關於體積的純虛函數
};

//定義正方體類
class CCube:public CSolid
{
public:
    CCube(double l=0,double w=0,double h=0):length(l),width(w),height(h) {}    //長方體類的構造函數
    double get_area()
    {
        return 2*(length*width+length*height+width*height);
    }
    double get_volume()
    {
        return length*width*height;
    }
protected:
    double length;    //長
    double width;     //寬
    double height;    //高
};

//定義球體類
class CBall:public CSolid
{
public:
    CBall(double r=0):radius(r) {}    //球體的構造函數
    double get_area()
    {
        return 4*3.14*radius*radius;
    }
    double get_volume()
    {
        return 4/3*3.14*radius*radius*radius;
    }
protected:
    double radius;    //半徑
};

//定義圓柱體類
class CCylinder:public CSolid
{
public:
    CCylinder(double r=0,double h=0):radius(r),height(h) {}    //圓柱的構造函數
    double get_area()
    {
        return 3.14*radius*radius*2+2*3.14*radius*height;
    }
    double get_volume()
    {
        return 3.14*radius*radius*height;
    }
protected:
    double radius;    //地面半徑
    double height;    //高
};
//測試函數
int main()
{
    double s,v;    //表示表面積和體積
    CSolid *p;     //指向基類的指針

    CCube a(1,1,1);
    cout<<"長方體的長:1\t寬:1\t高:1"<<endl;
    p=&a;         //指向長方體的對象
    s=p->get_area( );
    v=p->get_volume( );
    cout<<"表面積:"<<s<<endl;
    cout<<"體積:"<<v<<endl<<endl;

    CBall b(1);
    cout<<"球的半徑:1"<<endl;
    p=&b;         //指向球的對象
    s=p->get_area( );
    v=p->get_volume( );
    cout<<"表面積:"<<s<<endl;
    cout<<"體積:"<<v<<endl<<endl;

    CCylinder c(1,1);
    cout<<"圓柱體的底面半徑:1\t高:1"<<endl;
    p=&c;        //指向圓柱的對象
    s=p->get_area( );
    v=p->get_volume( );
    cout<<"表面積:"<<s<<endl;
    cout<<"體積:"<<v<<endl<<endl;
    return 0;
}

運行結果:


知識點總結:

抽象類的定義: virtual   加上  =0;

只有繼承虛函數,並覆蓋了同名的虛函數,纔可以利用指向基類的指針自由指向派生類的同名成員函數,實現動態多態性


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章