1. 抽象类(Abstract Class)
-
定义: 抽象类至少包含一个纯虚函数的类。它通常用于定义一个接口,为派生类提供一个基类。
-
作用: 它定义了派生类应该实现的接口和方法的原型,但不提供方法的具体实现。
-
创建对象: 不能直接实例化抽象类来创建对象。
2. 纯虚函数(Pure Virtual Function)
-
定义: 在类中声明的、没有具体实现、以
= 0
结尾的虚函数。 -
作用: 强制要求派生类必须覆盖这个函数,提供具体的实现。
-
声明方式:
virtual ReturnType FunctionName(Parameters...) = 0;
3. 代码示例
// 抽象类
class Shape {
public:
// 纯虚函数
virtual void draw() const = 0;
virtual void rotate() = 0;
virtual ~Shape()};
// 派生类
class Circle : public Shape {
public:
void draw() const override {
// 实现绘制圆形的代码
}
void rotate() override {
// 实现旋转圆形的代码
}
};
在上面的代码中,Shape
是一个抽象类,它定义了两个纯虚函数:draw
和rotate
。Circle
是一个派生自Shape
的类,它提供了这两个函数的具体实现。
4. 使用场景
- 当你希望定义一个通用接口,由不同的子类以不同的方式实现时,可以使用抽象类。
- 用于多态性,可以使用抽象类的指针或引用来实现对所有派生类对象的通用操作。
- 设计模式中常见,如工厂模式、模板方法模式中经常作为基类。
5. 注意事项
- 纯虚函数定义了接口,不提供实现。派生类必须覆盖所有纯虚函数,否则它们自己也将成为抽象类。
- 抽象类可以包含非纯虚函数,这些函数可以有自己的默认实现。
- 抽象类可以有构造函数,虽然不能直接创建对象,但可以在派生类对象创建时被调用。
- 抽象类的指针或引用可以指向派生类的对象,这是多态的基础。
- 如果一个类从抽象类派生,但没有实现所有纯虚函数,那么这个派生类也是抽象类。
- 抽象类的析构函数应该是虚的,这确保了通过基类指针删除派生类对象时能够调用正确的析构函数。