抽象类
如果一个类中至少包含一个纯虚函数,则该类称为抽象类,因此抽象类是基于纯虚函数的。例3-21中基类Animal中声明了纯虚函数print_color(),则该类是抽象类。抽象类的主要作用是通过它为一个类群建立一个公共的接口,使它们能够更有效地发挥多态特性。抽象类声明了公共接口,而接口的完整实现,即纯虚函数的函数体,要由派生类自己定义。
抽象类的定义形式如下所示:
class 类名
{
public:
virtual 函数返回值类型 函数名(参数表) = 0;
其他函数声明
};
对于纯虚函数和抽象类,使用时应注意以下情况:
1、 抽象类只能做基类来派生新类,不能声明抽象类对象,但可以声明抽象类指针或引用,通过指针或引用操作派生类对象。
2、 抽象类中可以有多个纯虚函数,在派生类中应该实现这些纯虚函数,使得派生类不再是抽象类。派生类中若没有实现所有纯虚函数,则未重新定义的函数仍为纯虚函数,派生类也是抽象类。
接下来再给出一个案例来说明抽象类的定义及使用,如例1所示。
例1
1 #include<iostream>
2 using namespace std;
3 const double PI = 3.14159;
4 class Shapes //定义表示形状的抽象类
5 {
6 public:
7 Shapes(int x, int y = 0);
8 virtual ~Shapes();
9 virtual void disp() = 0; //声明纯虚函数,显示形状面积
10 protected:
11 int m_nX, m_nY;
12 };
13 Shapes::Shapes(int x, int y) //定义Shapes类的构造函数
14 {
15 m_nX = x;
16 m_nY = y;
17 }
18 Shapes::~Shapes() //定义Shapes类的析构函数
19 {
20 cout << "Shapes destructor!" << endl;
21 }
22 class Square:public Shapes //矩形派生类
23 {
24 public:
25 Square(int square_x, int square_y);
26 ~Square();
27 void disp();
28 };
29 //矩形类Square构造函数的实现
30 Square::Square(int square_x, int square_y):Shapes(square_x, square_y)
31 {
32 }
33 Square::~Square() //矩形类Square析构函数的实现
34 {
35 cout << "Square destructor!" << endl;
36 }
37 void Square::disp() //对基类纯虚函数的实现
38 {
39 cout << "square area:" << m_nX * m_nY << endl;
40 }
41 class Circle:public Shapes //圆形派生类
42 {
43 public:
44 Circle(int radius);
45 ~Circle();
46 void disp(); //与基类纯虚函数同名的函数
47 };
48 Circle::Circle(int radius):Shapes(radius) //派生类Circle构造函数的实现
49 {
50 }
51 Circle::~Circle() //派生类Circle析构函数的实现
52 {
53 cout << "Circle destructor!" << endl;
54 }
55 void Circle::disp() //对基类纯虚函数的实现
56 {
57 cout << "circle area:" << PI * m_nX * m_nX << endl;
58 }
59 int main()
60 {
61 Shapes *ptr[2]; //定义基类指针数组
62
63 ptr[0] = new Square(10, 5); //通过new创建派生类Square对象
64 ptr[0]->disp();
65 ptr[1] = new Circle(10); //通过new创建派生类Circle对象
66 ptr[1]->disp();
67 for (int i = 0; i < 2; i++)
68 delete ptr[i];
69 system("pause");
70 return 0;
71 }
运行结果如图1所示。
图1 例1运行结果
例1中定义了抽象类Shapes,在代码第9行声明抽象类的纯虚函数disp(),代码第8行声明抽象类的虚析构函数。派生类Square和Circle公有继承并重新定义了纯虚函数disp(),如代码第37-40行和55-58行,分别用于显示矩形面积和圆形面积。main()函数中定义了基类指针数组,两个指针分别指向了Square和Circle派生类的对象。从运行结果看出,通过派生类重新定义的disp()函数显示了矩形和圆形的面积。由于基类的析构函数为虚函数,因此通过delete操作基类指针时会依次调用派生类和基类的析构函数,释放所有资源。