纯虚函数(Pure Virtual Function)详解
纯虚函数(Pure Virtual Function)详解
1. 基本定义
纯虚函数是C++中一种特殊的虚函数,用于在基类中定义抽象接口。
语法形式:在虚函数声明后加上 = 0
。
class Base {
public:
virtual void func() = 0; // 纯虚函数
};
2. 核心特性
- 必须被派生类重写:所有继承该基类的具体子类都必须实现这个函数。
- 基类不可实例化:包含纯虚函数的类称为抽象类,不能直接创建对象。
Base obj; // 错误!抽象类不能实例化
3. 与普通虚函数的区别
特性 | 普通虚函数 | 纯虚函数 |
---|---|---|
是否有默认实现 | 可以有默认实现(可选的) | 无默认实现(必须由子类实现) |
基类能否实例化 | 可以(基类为具体类) | 不能(基类是抽象类) |
是否强制子类重写 | 否(子类可选择是否重写) | 是(子类必须重写) |
4. 典型应用场景
- 定义接口规范:强制所有子类实现统一的方法。
- 实现多态:通过基类指针调用不同子类的实现。
- 框架设计:例如在GUI库中定义Shape基类,要求子类必须实现
draw()
方法。
示例代码:
// 抽象基类:动物
class Animal {
public:
virtual void makeSound() = 0; // 纯虚函数
};
// 具体子类:狗
class Dog : public Animal {
public:
void makeSound() override { // 必须实现
cout << "Woof!" << endl;
}
};
// 具体子类:猫
class Cat : public Animal {
public:
void makeSound() override { // 必须实现
cout << "Meow!" << endl;
}
};
// 使用多态
Animal* animal1 = new Dog();
Animal* animal2 = new Cat();
animal1->makeSound(); // 输出 "Woof!"
animal2->makeSound(); // 输出 "Meow!"
5. 高级用法
纯虚析构函数
抽象类需要析构函数时,必须显式定义(即使它是纯虚的):
class AbstractBase {
public:
virtual ~AbstractBase() = 0; // 纯虚析构函数
};
AbstractBase::~AbstractBase() {} // 必须提供实现
接口类(C++11+)
使用 override
关键字明确表示重写:
class Interface {
public:
virtual void method() = 0;
virtual ~Interface() = default;
};
class Concrete : public Interface {
public:
void method() override { /* 实现 */ }
};
6. 注意事项
子类未实现纯虚函数
若子类未完全实现所有纯虚函数,该子类仍为抽象类。
class Bird : public Animal {
// 未实现 makeSound(), Bird 仍是抽象类
};
Bird b; // 编译错误!
多继承中的纯虚函数
避免多继承的纯虚函数冲突,需明确指定实现:
class A { public: virtual void func() = 0; };
class B { public: virtual void func() = 0; };
class C : public A, public B {
public:
void func() override { /* 统一实现 */ }
};
7. 实际工程意义
- 强制接口一致性:确保不同模块遵循统一规范(如插件系统)。
- 解耦设计:调用方依赖抽象接口,而非具体实现。
- 扩展性:新增子类时无需修改基类代码(开闭原则)。
总结
纯虚函数是C++实现多态和接口抽象的核心机制,通过强制子类实现特定方法,为大型系统的模块化设计提供基础保障。