📜  C++ 中的虚函数(1)

📅  最后修改于: 2023-12-03 14:39:54.757000             🧑  作者: Mango

C++ 中的虚函数

在 C++ 中,虚函数是一种能够在父类中被子类继承、重写的函数。虚函数可以在运行时确定调用的是哪个子类的函数,从而实现多态特性。这使得 C++ 的面向对象编程更加灵活。

虚函数的声明

在将函数声明为虚函数时,需要在函数声明前加上 virtual 关键字。

class Base {
public:
    virtual void foo() {
        std::cout << "Base::foo()" << std::endl;
    }
};

在上面的代码中,foo() 函数被声明为虚函数。

虚函数的重写

子类可以重写父类中的虚函数。在子类中,可以直接实现虚函数而不需要在函数声明前加上 virtual 关键字。

class Derived : public Base {
public:
    void foo() override {
        std::cout << "Derived::foo()" << std::endl;
    }
};

在上面的代码中,Derived 类继承自 Base 类,并重写了 foo() 函数。该函数会输出 "Derived::foo()"。

虚函数的多态

当需要通过父类指针或引用调用虚函数时,运行时将自动选择合适的子类函数来调用。

int main()
{
    Base* p_base = new Derived();
    p_base->foo();    // 输出 "Derived::foo()"
    delete p_base;
    return 0;
}

在上面的代码中,p_base 指向 Derived 类对象,但是使用 Base 指针调用 foo() 函数时,将调用 Derived 类中重写的 foo() 函数。

虚函数表

虚函数表是一个可选的数据结构,它存储了一个类中所有虚函数的地址,用于实现虚函数的多态。每个类只有一个虚函数表,位于对象的内存空间中的一个固定位置。

总结

虚函数是 C++ 中实现多态特性的重要手段,但是虚函数需要额外的计算资源,常常不太适用于实时环境中。此外,虚函数表的存在可能会增加对象的内存使用量。开发者在设计 C++ 类时需要仔细考虑虚函数的声明和重写,以及如何最大化地利用虚函数的多态机制。