纯虚函数通过=0定义,含纯虚函数的类为抽象类,不可实例化,派生类必须重写纯虚函数;抽象类常用于接口设计,应仅含纯虚函数和虚析构函数,避免数据成员和默认实现;多态通过基类指针调用派生类方法实现,适用于策略、工厂等模式,虚析构函数确保正确析构,保持接口纯粹性。

在C++中,纯虚函数是实现接口定义的核心机制。它允许基类声明一个没有实现的函数,强制派生类提供具体实现。这种机制常用于设计可扩展的类体系,特别是在需要定义统一行为规范但不关心具体实现时。
纯虚函数的基本语法
纯虚函数通过在函数声明后加上 = 0 来定义。包含至少一个纯虚函数的类称为抽象类,不能直接实例化。
- 纯虚函数必须在派生类中被重写,否则派生类仍是抽象类
- 语法格式:virtual 返回类型 函数名(参数列表) = 0;
- 抽象类可以包含普通成员函数、构造函数、析构函数等
示例:
class Shape {
public:
virtual double area() const = 0; // 纯虚函数
virtual ~Shape() = default; // 虚析构函数
};
接口类的设计规范
当使用纯虚函数定义接口时,应遵循一些通用规范,以提高代码的可维护性和可扩展性。
立即学习“C++免费学习笔记(深入)”;
- 接口类应只包含纯虚函数和虚析构函数,不包含数据成员
- 析构函数应声明为虚函数,确保通过基类指针删除对象时正确调用派生类析构函数
- 函数命名清晰,体现行为意图,如 onEvent、doWork 等
- 避免在接口中提供默认实现(C++11起允许,但应谨慎使用)
良好接口示例:
class Drawable {
public:
virtual void draw() const = 0;
virtual void show() = 0;
virtual void hide() = 0;
virtual ~Drawable() = default;
};
多态使用的典型场景
纯虚函数的主要价值体现在运行时多态。通过基类指针或引用调用虚函数,实际执行的是派生类的实现。
- 适合用于插件架构、策略模式、工厂模式等设计模式
- 便于替换具体实现,提升模块解耦
- 支持集合管理不同类型的对象,例如 vector
>
使用示例:
class Circle : public Shape {
public:
double area() const override {
return 3.14 * radius * radius;
}
private:
double radius = 1.0;
};
// 多态调用
Shape* s = new Circle();
s->area(); // 调用 Circle::area()
基本上就这些。只要掌握纯虚函数的定义方式、接口类的设计原则和多态调用的使用方法,就能写出清晰、可扩展的C++接口代码。注意析构函数的虚化和避免在接口中添加状态,是保持接口纯粹性的关键。










