在本章开头介绍的RPG游戏中共有4个类。其中玩家类作为父类,剑士类、弓箭手类、魔法师类分别继承玩家类,作为子类。当我们开始游戏时,需要选择创建某一个类的对象,才能进行游戏。然而,我们的选择不应该是4个类,而应该只能在剑士类、弓箭手类或魔法师类中做出选择。因为,单纯的玩家类是抽象的、不完整的,任何一个玩家必须有一个确定的职业之后,才能确定他的具体技能。又比如学生类,它也是非常抽象的。让一个小学生、中学生或本科生学习,他们都有各自学习的内容。而一个抽象概念的学生,他却不知道该学些什么。
这时,我们必须要对玩家类或学生类作一些限制了。由于玩家类和学生类直接实例化而创建的对象都是抽象而没有意义的,所以我们希望玩家类和学生类只能用于被继承,而不能用于直接创建对象。在C++中,我们可以把只能用于被继承而不能直接创建对象的类设置为抽象类(Abstract Class)。
之所以要存在抽象类,最主要是因为它具有不确定因素。我们把那些类中的确存在,但是在父类中无法确定具体实现的成员函数称为纯虚函数。纯虚函数是一种特殊的虚函数,它只有声明,没有具体的定义。抽象类中至少存在一个纯虚函数;存在纯虚函数的类一定是抽象类。存在纯虚函数是成为抽象类的充要条件。
那么我们该如何定义一个纯虚函数呢?纯虚函数的声明有着特殊的语法格式:
virtual 返回值类型成员函数名(参数表)=0;
请注意,纯虚函数应该只有声明,没有具体的定义,即使给出了纯虚函数的定义也会被编译器忽略。下面我们就修改一下程序17.7.1,将学生类变成一个抽象类:(程序17.9)
//student.h
这时,我们必须要对玩家类或学生类作一些限制了。由于玩家类和学生类直接实例化而创建的对象都是抽象而没有意义的,所以我们希望玩家类和学生类只能用于被继承,而不能用于直接创建对象。在C++中,我们可以把只能用于被继承而不能直接创建对象的类设置为抽象类(Abstract Class)。
之所以要存在抽象类,最主要是因为它具有不确定因素。我们把那些类中的确存在,但是在父类中无法确定具体实现的成员函数称为纯虚函数。纯虚函数是一种特殊的虚函数,它只有声明,没有具体的定义。抽象类中至少存在一个纯虚函数;存在纯虚函数的类一定是抽象类。存在纯虚函数是成为抽象类的充要条件。
那么我们该如何定义一个纯虚函数呢?纯虚函数的声明有着特殊的语法格式:
virtual 返回值类型成员函数名(参数表)=0;
请注意,纯虚函数应该只有声明,没有具体的定义,即使给出了纯虚函数的定义也会被编译器忽略。下面我们就修改一下程序17.7.1,将学生类变成一个抽象类:(程序17.9)
//student.h










