1. 抽象类简介
抽象类被设计用来创建通用实体,并预期基于它创建更为具体的派生类。一个抽象类只能作为其他类的基类。因此,不能创建抽象类类型的对象。
包含至少一个纯虚函数的类被视为抽象类。因此,从抽象类派生的类必须实现所有的纯虚函数,否则它们也将被视为抽象类。
2. 纯虚函数
通过纯指定符语法来声明一个虚函数为“纯”。例如,有一个名为CAnimal的类,仅用于提供公共函数,但CAnimal类型的对象对于实际使用过于通用,因此,CAnimal是一个很好的抽象类示例:
class CAnimal
{
public:
CAnimal(); // 构造函数
virtual void Sound() = 0; // 一个纯虚函数
private:
double m_legs_count; // 动物的腿的数量
};
这里,Sound() 是一个纯虚函数,因为它使用了纯虚函数的PURE指定符(=0)。
3. 使用抽象类的示例
派生自抽象类的一个类:
class CCat : public CAnimal
{
public:
virtual void Sound() { Print("Myau"); } // 覆盖了PURE,所以CCat不是抽象的,可以创建
};
错误的使用示例:
new CAnimal; // 'CAnimal'的错误 - 编译器返回“不能实例化抽象类”的错误
CAnimal some_animal; // 'CAnimal'的错误 - 编译器返回“不能实例化抽象类”的错误
正确的使用示例:
new CCat; // 无错误 - CCat类不是抽象的
CCat cat; // 无错误 - CCat类不是抽象的
4. 抽象类的限制
如果抽象类的构造函数调用了纯虚函数(直接或间接),结果是不确定的。但是,抽象类的构造函数和析构函数可以调用其他成员函数。
结论
理解抽象类与纯虚函数的区别和应用是面向对象编程中非常关键的。它们允许程序员创建更为通用和模块化的代码,有助于提高代码的复用性和可维护性。