跳转到内容

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关键字明确表示覆盖

类图示例[编辑 | 编辑源代码]

classDiagram class Shape { <<abstract>> +area() double =0 } class Circle { -radius: double +area() double } class Rectangle { -width: double -height: double +area() double } Shape <|-- Circle Shape <|-- Rectangle

数学表示[编辑 | 编辑源代码]

在面向对象设计中,纯虚函数可以表示为: fpure virtual:C{0} 其中C是类,0表示必须由派生类实现。

总结[编辑 | 编辑源代码]

纯虚函数是C++实现多态和接口定义的重要机制。通过强制派生类实现特定函数,它确保了类层次结构中的行为一致性。理解纯虚函数是掌握C++面向对象高级特性的关键步骤。