在C++中,纯虚函数是一种没有实现、必须在派生类中重写的虚函数,它是实现抽象基类和接口设计的基础。通过纯虚函数,我们可以把一类对象的公共行为约定出来,而不关心具体怎么做。

什么是纯虚函数
纯虚函数在基类中声明时,写法是在函数声明的末尾加上 = 0,表示该函数没有默认实现。包含纯虚函数的类称为抽象基类,不能直接创建对象。
基本语法
// 抽象基类 Shape
class Shape {
public:
// 纯虚函数:计算面积
virtual double area() const = 0;
// 普通虚函数也可以存在
virtual void print() const {
// 默认打印提示
}
virtual ~Shape() {}
};
// 派生类 Circle 实现纯虚函数
class Circle : public Shape {
double r;
public:
Circle(double radius) : r(radius) {}
double area() const override {
return 3.14159 * r * r;
}
};
抽象基类与接口设计模式
在C++里并没有专门的 interface 关键字,通常用只含纯虚函数的抽象基类来模拟接口。接口设计模式强调:高层模块依赖抽象,不依赖具体实现。
常见用法示例
假设我们要设计一个日志模块,支持文件日志和屏幕日志:
// 日志接口(抽象基类)
class Logger {
public:
virtual void write(const std::string& msg) = 0;
virtual ~Logger() {}
};
// 文件日志实现
class FileLogger : public Logger {
public:
void write(const std::string& msg) override {
// 伪代码:写入文件
}
};
// 屏幕日志实现
class ConsoleLogger : public Logger {
public:
void write(const std::string& msg) override {
// 伪代码:输出到控制台
}
};
// 业务代码只依赖 Logger 接口
void process(Logger* log) {
log->write("start");
}
设计优势
- 降低耦合:调用方只认抽象接口
- 方便替换:新增实现不影响旧代码
- 易于测试:可用假对象模拟接口
注意事项
抽象基类应声明虚析构函数,否则通过基类指针删除派生类对象时可能漏掉资源释放。另外,派生类必须实现全部纯虚函数,否则它仍是抽象类。
纯虚函数让 C++ 在没有接口关键字的情况下,依然能优雅地实现面向接口编程。
小结
定义纯虚函数只需在虚函数后写 = 0,由此得到的抽象基类不能实例化,却可作为接口被多方实现。掌握它能让你写出更灵活、易维护的 C++ 程序。