Skip to content

虚函数 ​

虚函数是 C++ 中实现运行时多态的核心机制,允许派生类重写基类的成员函数。

虚函数是使用关键字 virtual 修饰的非静态成员函数。

cpp
class Base {
public:
    virtual void foo() {        // 使用 virtual 声明
        cout << "Base::foo" << endl;
    }
    virtual ~Base() = default;  // 基类析构函数通常设为 virtual
};

class Derived : public Base {
public:
    void foo() override {       // 可选:显式标记覆盖
        cout << "Derived::foo" << endl;
    }    
};

int main() {
    Base* ptr = new Derived();
    ptr->foo(); // 输出:Derived::foo(运行时多态)
}

虚函数的工作原理 ​

  • 每个包含虚函数的类自动生成一个 vftable(虚函数表),表中存放所有虚函数的地址。
  • 对象中存储指向虚函数表的指针 vfptr,运行时通过该指针调用对应的虚函数。
cpp
class Base {
public:
    virtual void f1();
    virtual void f2();
    void normal();
};

class Derived : public Base {
public:
    void f1() override;
    virtual void f3();
};

Base b_obj;
Derived d_obj;
Base* ptr = &d_obj;
ptr->f1(); // -> Derived::f1()

  1. 获取 vfptr
  2. 索引 vftable
  3. 获取目标函数地址
  4. 跳转到代码:Derived::f1()