跳至主要內容

C++虚函数

知识库编程技巧C++C++大约 2 分钟

C++ 虚函数

C++的虚函数是一种特殊的成员函数,可以在派生类中被重写。

虚函数的作用是实现多态性,当我们使用基类指针或引用来调用虚函数时,程序会根据实际的对象类型来调用相应的派生类函数。

我们可以将一个成员函数声明为虚函数,只需要在函数声明前加上关键字 virtual 即可。比如这样:

class Base {
public:
    virtual void func() {
        // ...
    }
};

class Derived : public Base {
public:
    void func() override {
        // ...
    }
};

C++ 虚函数案例

为方便读者理解,小林写个虚函数 demo:

# include <iostream>

using namespace std;

class Shape {
public:
    virtual void draw() {
        cout << "绘制形状" << endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        cout << "画一个圆圈" << endl;
    }
};

int main() {
    Shape*shape1 = new Shape();
    Shape* shape2 = new Circle();

    shape1->draw();
    shape2->draw();

    delete shape1;
    delete shape2;

    return 0;
}

在上述小林写的 demo 中,我定义了一个基类 Shape 和一个派生类 Circle,其中 Shape 类中的 draw() 函数被声明为虚函数。

在主函数中,小林分别使用基类指针 shape1 和派生类指针 shape2 来调用 draw() 函数。

编译运行结果:

绘制形状
画一个圆圈

--------------------------------
Process exited after 0.1217 seconds with return value 0
请按任意键继续. . .

C++ 虚函数注意事项

  • 虚函数只能是类的成员函数,不能是静态成员函数或全局函数。
  • 构造函数和析构函数不能是虚函数,因为它们的调用顺序是确定的,不需要动态确定。
  • 如果一个类中有虚函数,它必须有至少一个虚函数被实现,否则编译器会报错。
  • 在派生类中重写虚函数时,函数签名必须与基类中的虚函数完全相同,否则编译器会报错。
  • 如果派生类中重写虚函数时不使用 override 关键字,编译器会给出警告,但不会报错。
  • 虚函数的调用会带来额外的开销,因为程序需要在运行时查找正确的函数地址。因此,在程序中过多地使用虚函数可能会影响性能。
  • 如果在基类中将虚函数声明为纯虚函数,派生类必须实现该函数,否则派生类也会成为抽象类,无法实例化。