使用一个通俗且易理解的方法来讲纯虚类,假设有鸟类,该类有个属性是鸟会飞,企鹅也属于鸟类,但企鹅不会飞,那我们不想在企鹅内部继承与飞相关的属性。在比如圆和椭圆,在数学定义中圆是属于特殊的椭圆,若我们按照定义去取椭圆为基类,会发现有很多不需要的点,比如椭圆存在长轴,短轴,同时椭圆旋转角度不一样,它的形状便不一样,这些对于圆来说都是不需要的,因此简单的将圆继承于椭圆显然不合适,因此便发明了抽象类。抽象类的申明,首先依靠于纯虚函数,virtual void food() = 0; 便为纯虚函数,即在虚函数申明之后再在虚函数后面添加一个=0。抽象类只能作为基类,同时纯虚函数可以只申明而不定义(正式因为此,所以拥有存虚函数的类只可以当基类),当编程时,对于椭圆和圆相同的部分,我们可以创建保护函数来继承(比如圆心坐标的平移),但对于不相同的地方,我们便可以采用纯虚类的方式加以区分(比如面积的计算)。
以下给出抽象类的一个简单例子:
class animal
{
public:void sleep() { cout << "趴着睡觉" << endl; }// 使虚函数等于0便创建了纯虚函数(纯虚函数可以只申明不定义),有纯虚函数的类便称为抽象类,注意纯虚函数只能放在基类里面,因此抽象类都是基类// 抽象类可以不定义对象virtual void food() = 0;
};
class tiger :public animal
{
public:virtual void food() { cout << "Tiger food is meat.\n"; }
};
class cow :public animal
{
public:virtual void food() { cout << "cow food is gross.\n"; }
};
int main()
{tiger ti;ti.sleep();ti.food();cow co;co.sleep();co.food();
}
更详细的抽象类知识,请参照《c++primer plus》第508页。注意:抽象类,可以只定义接口,而不涉及实现。并且抽象类不能用于创建对象。