C++ 纯虚函数
外观
C++纯虚函数[编辑 | 编辑源代码]
纯虚函数(Pure Virtual Function)是C++面向对象编程中的一个核心概念,它用于定义抽象基类(Abstract Base Class),强制派生类必须实现该函数。纯虚函数通过在函数声明末尾添加 `= 0
` 来标识。
定义与语法[编辑 | 编辑源代码]
纯虚函数的语法如下:
class AbstractClass {
public:
virtual void pureVirtualFunction() = 0; // 纯虚函数
};
- 包含纯虚函数的类称为抽象类,不能直接实例化。
- 派生类必须实现所有纯虚函数,否则它也会成为抽象类。
为什么使用纯虚函数?[编辑 | 编辑源代码]
纯虚函数的主要用途包括: 1. 定义接口规范:基类声明纯虚函数,强制派生类实现特定行为。 2. 实现多态:通过基类指针或引用调用派生类的实现。 3. 防止基类实例化:确保只有派生类能被实例化。
代码示例[编辑 | 编辑源代码]
基本示例[编辑 | 编辑源代码]
#include <iostream>
using namespace std;
class Shape {
public:
virtual double area() const = 0; // 纯虚函数
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() const override { // 必须实现
return 3.14159 * radius * radius;
}
};
int main() {
Shape* shape = new Circle(5.0);
cout << "Circle area: " << shape->area() << endl;
delete shape;
return 0;
}
输出:
Circle area: 78.5397
多态示例[编辑 | 编辑源代码]
class Rectangle : public Shape {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() const override {
return width * height;
}
};
int main() {
Shape* shapes[2] = { new Circle(3.0), new Rectangle(4.0, 5.0) };
for (Shape* s : shapes) {
cout << "Area: " << s->area() << endl;
}
// 释放内存...
}
</pre>
'''输出''':
<pre>
Area: 28.2743
Area: 20
</pre>
== 实际应用场景 ==
1. '''图形系统''':如上面的Shape示例,不同图形计算面积的方式不同。
2. '''插件架构''':基类定义接口,具体插件实现功能。
3. '''游戏开发''':定义GameObject基类,派生类实现特定行为。
== 纯虚函数 vs 虚函数 ==
{| class="wikitable"
|-
! 特性 !! 纯虚函数 !! 虚函数
|-
| 定义方式 || <code>= 0</code> || 普通虚函数
|-
| 基类实现 || 不允许有实现 || 可以有实现
|-
| 派生类必须实现 || 是 || 否
|-
| 使类成为抽象类 || 是 || 否
|}
== 高级主题 ==
=== 纯虚函数的实现 ===
虽然纯虚函数通常没有实现,但C++允许提供默认实现:
<syntaxhighlight lang="cpp">
class Abstract {
public:
virtual void func() = 0;
};
// 在cpp文件中
void Abstract::func() {
cout << "Default implementation" << endl;
}
派生类可以通过作用域运算符调用基类实现:
class Concrete : public Abstract {
public:
void func() override {
Abstract::func(); // 调用基类实现
// 添加额外功能...
}
};
接口类[编辑 | 编辑源代码]
C++没有专门的接口关键字,但可以通过只有纯虚函数的类模拟接口:
class IComparable {
public:
virtual int compareTo(const IComparable& other) const = 0;
virtual ~IComparable() = default;
};
注意事项[编辑 | 编辑源代码]
1. 抽象类的析构函数应该声明为虚函数
2. 纯虚函数可以有参数和返回值
3. 构造函数不能是虚函数
4. C++11起可以使用override
关键字明确表示覆盖
类图示例[编辑 | 编辑源代码]
数学表示[编辑 | 编辑源代码]
在面向对象设计中,纯虚函数可以表示为: 其中C是类,0表示必须由派生类实现。
总结[编辑 | 编辑源代码]
纯虚函数是C++实现多态和接口定义的重要机制。通过强制派生类实现特定函数,它确保了类层次结构中的行为一致性。理解纯虚函数是掌握C++面向对象高级特性的关键步骤。