C++的虚函数和纯虚函数
时间: 2025-05-12 16:44:37 浏览: 16
### C++ 中虚函数和纯虚函数的概念及用法
#### 虚函数
虚函数是 C++ 中用于实现动态绑定或多态的一种机制。当一个基类的成员函数被声明为 `virtual` 时,它允许派生类对该函数进行重写(覆盖)。如果通过基类类型的指针或引用调用此虚函数,则实际执行的是派生类中对应的版本[^1]。
以下是虚函数的一个简单例子:
```cpp
#include <iostream>
class Base {
public:
virtual void display() { std::cout << "Base Class" << std::endl; }
};
class Derived : public Base {
public:
void display() override { std::cout << "Derived Class" << std::endl; }
};
void callDisplay(Base* obj) {
obj->display();
}
int main() {
Base b;
Derived d;
callDisplay(&b); // 输出: Base Class
callDisplay(&d); // 输出: Derived Class (多态行为)
return 0;
}
```
在这个例子中,尽管 `callDisplay` 函数接受的是 `Base*` 类型的参数,但由于 `display()` 是虚函数,在传递 `Derived` 对象时会调用派生类中的实现[^2]。
---
#### 纯虚函数
纯虚函数是一种特殊的虚函数,它的定义形式是在函数原型后面加 `= 0`。含有纯虚函数的类被称为抽象类,无法直接实例化对象。纯虚函数的主要目的是强制要求派生类必须提供自己的具体实现[^3]。
下面是一个带有纯虚函数的例子:
```cpp
#include <iostream>
#include <string>
class Animal {
public:
virtual ~Animal() {} // 建议给抽象类添加虚拟析构函数
virtual void speak() = 0; // 纯虚函数
};
class Dog : public Animal {
public:
void speak() override { std::cout << "Woof!" << std::endl; }
};
class Cat : public Animal {
public:
void speak() override { std::cout << "Meow!" << std::endl; }
};
void makeSound(Animal* animal) {
animal->speak();
}
int main() {
Dog dog;
Cat cat;
makeSound(&dog); // 输出: Woof!
makeSound(&cat); // 输出: Meow!
return 0;
}
```
在此示例中,`Animal` 是一个抽象类,因为它包含了一个未实现的纯虚函数 `speak()`。任何继承自 `Animal` 的子类都必须实现该方法才能成为具体的可实例化的类[^4]。
---
#### 虚函数与纯虚函数的区别
| **特性** | **虚函数** | **纯虚函数** |
|-----------------------|-----------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
| 定义方式 | 使用 `virtual` 关键字 | 使用 `virtual` 加上`= 0` |
| 是否有默认实现 | 可以有默认实现 | 不提供默认实现 |
| 抽象类的关系 | 所属类不一定是抽象类 | 所属类必定是抽象类 |
| 子类的要求 | 子类可以选择性地重载 | 子类必须实现 |
---
#### 使用场景分析
- **虚函数适用场景**: 当希望某些功能可以在基类中给出通用实现,而其他特定的功能留给派生类自行决定是否重新定义时,适合使用普通的虚函数。
- **纯虚函数适用场景**: 如果某个接口对于所有派生类来说都是必需的,并且不存在统一的行为模式或者根本不需要在基类里实现逻辑的情况下,应该考虑采用纯虚函数来设计这种关系结构。
---
阅读全文
相关推荐



















