一個接口,多種方式”。
我們來看一個例子:編寫一個程式計算正方體、球體和圓柱體的表面積和體積。
(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;
}