9.6.4 纯虚函数
下面描述的情形是可能的:我们希望在基类中包括一个虚函数,这样就可以在派生类中为适应派生类对象而重新定义该函数,但我们在基类中却无法给予该函数任何有意义的定义。
例如,我们可能有一个CContainer类,它可以用作定义CBox类、CBottle类乃至CTeapot类的基类。CContainer类将没有数据成员,但我们可能希望为任何派生类提供一个虚成员函数Volume()。因为CContainer类没有任何数据成员,因此也没有尺寸,所以我们不能为Volume()函数写出什么有意义的定义。然而,我们仍然能够定义这个类-- 当然包括成员函数Volume(),CContainer类定义的代码如下所示:
- // Container.h for Ex9_10
- #pragma once
- #include <iostream>
- using std::cout;
- using std::endl;
-
- class CContainer // Generic base class for specific containers
- {
- public:
- // Function for calculating a volume - no content
- // This is defined as a 'pure' virtual function, signified by '= 0'
- virtual double Volume() const = 0;
-
- // Function to display a volume
- virtual void ShowVolume() const
- {
- cout << endl
- << "Volume is " << Volume();
- }
- };
定义虚函数Volume()的语句通过在函数头中添加等号和0,将该函数定义成没有任何内容。这样的函数被称为纯虚函数。该类的任何派生类都必须要么定义Volume()函数,要么重新将其定义成纯虚函数。因为我们已经将Volume()声明为const,所以在任何派生类中该函数的实现也都必须是const。记住,即使名称和形参列表相同,但函数的const和非const变体也是不同的函数。换句话说,我们可以使用const来重载函数。
该类还包含一个显示派生类对象体积的函数ShowVolume()。因为该函数被声明为virtual,所以在派生类中当然可以被替换。但是如果不进行替换,则程序将调用这里的基类版本。