【c++中虚函数和纯虚函数的区别】在C++面向对象编程中,虚函数和纯虚函数是实现多态的重要机制。它们都与类的继承和动态绑定有关,但两者在功能和使用上有着明显的区别。以下是对两者的主要区别的总结。
一、基本概念
- 虚函数(Virtual Function):在基类中定义,并用`virtual`关键字修饰的函数。它允许派生类重写该函数,从而实现运行时的多态。
- 纯虚函数(Pure Virtual Function):在基类中声明但没有实现的虚函数,其定义形式为 `virtual 返回类型 函数名(参数列表) = 0;`。包含纯虚函数的类称为抽象类,不能实例化。
二、主要区别对比
| 对比项 | 虚函数 | 纯虚函数 |
| 定义方式 | 使用 `virtual` 关键字,有具体实现 | 使用 `virtual` 关键字,且 `= 0` 没有实现 |
| 是否可以被实例化 | 可以 | 不可以(抽象类) |
| 是否必须被重写 | 可以不重写 | 必须被重写 |
| 是否能直接调用 | 可以 | 不能直接调用 |
| 是否允许在派生类中不实现 | 允许 | 不允许 |
| 是否属于抽象类 | 不属于 | 属于 |
| 用途 | 实现多态 | 定义接口或规范 |
三、使用场景
- 虚函数适用于需要在不同子类中提供不同实现,但基类也提供默认行为的情况。例如,一个图形类中的`draw()`方法可以在不同子类中实现不同的绘制逻辑,而基类提供一个基础的实现。
- 纯虚函数则常用于定义接口或抽象类,强制所有派生类必须实现某些方法。例如,在设计一个“形状”类时,可以将`area()`定义为纯虚函数,要求所有派生类(如矩形、圆形等)都必须实现这个方法。
四、示例代码
```cpp
// 虚函数示例
class Shape {
public:
virtual void draw() {
cout << "Drawing a shape." << endl;
}
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing a circle." << endl;
}
};
// 纯虚函数示例
class AbstractShape {
public:
virtual void draw() = 0; // 纯虚函数
};
class Square : public AbstractShape {
public:
void draw() override {
cout << "Drawing a square." << endl;
}
};
```
五、总结
虚函数和纯虚函数虽然都用于实现多态,但它们在使用目的、类的可实例化性以及是否必须重写等方面存在显著差异。合理选择虚函数或纯虚函数,有助于构建更清晰、更灵活的面向对象系统。


