学科分类
目录
C++基础

抽象类

如果一个类中至少包含一个纯虚函数,则该类称为抽象类,因此抽象类是基于纯虚函数的。例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操作基类指针时会依次调用派生类和基类的析构函数,释放所有资源。

点击此处
隐藏目录