天天看點

利用虛函數設計統一的公共接口(求體積與表面積)

一個接口,多種方式”。

我們來看一個例子:編寫一個程式計算正方體、球體和圓柱體的表面積和體積。

(1)分析一下,公共的功能是要求這幾個立方體的表面積和體積。

(2)設計一個公共基類Container為抽象類(界面),它包含了這些抽象公共功能。是以,Container類中聲明求表面積和體積的純虛函數。另外,Container類中定義一個公共的資料成員radius,此資料可作為球體的半徑、正方體的邊長,圓柱體底面圓半徑。

(3)由Container抽象類派生出三個類,即Cude、Sphere、Cylinder,在這三個類中都具有求表面積和體積的重定義。

結構如下圖所示:

利用虛函數設計統一的公共接口(求體積與表面積)

程式如下:

#include<iostream>
using namespace std;

class Container
{
protected:
  double radius;
public:
  Container(double radius)
  {
    Container::radius = radius;
  }
  virtual double surface() = 0;           //純虛函數
  virtual double volume() = 0;            //純虛函數
};

//定義正方體類
class Cube :public Container
{
public:
  Cube(double radius) :Container(radius)
  {};
  double surface()
  {
    return radius*radius * 6;
  }
  double volume()
  {
    return radius*radius*radius;
  }
};
//定義球體類
class Sphere :public Container
{
public:
  Sphere(double radius) :Container(radius)
  {};
  double surface()
  {
    return 4 * 3.1416*radius*radius;
  }
  double volume()
  {
    return radius*radius*radius * 4 / 3 * 3.1416;
  }
}; 

//定義圓柱體類
class Cylinder :public Container
{
  double height;
public:
  Cylinder(double radius,double height) :Container(radius)
  {
    Cylinder::height = height;
  };
  double surface()
  {
    return 2 * 3.1416*radius*(height + radius);
  }
  double volume()
  {
    return radius*radius*height * 3.1416;
  }
};

int main()
{
  Container *p;                       //定義抽象類指針p
  Cube obj1(1);                       //建立正方體對象obj1
  Sphere obj2(1);                     //建立球體對象obj2
  Cylinder obj3(1, 1);                //建立圓柱體對象obj3

  p = &obj1;                          //指針p指向正方體對象obj1
  cout << "正方體表面積:" << p->surface() << endl;
  cout << "正方體體積:" << p->volume() << endl;

  p = &obj2;                          //指針p指向球體對象obj2
  cout << "球體表面積:" << p->surface() << endl;
  cout << "球體體積:" << p->volume() << endl;

  p = &obj3;                          //指針p指向圓柱體對象obj3
  cout << "圓柱體表面積:" << p->surface() << endl;
  cout << "圓柱體體積:" << p->volume() << endl;

  system("pause");
  return 0;
}      

繼續閱讀