📅  最后修改于: 2023-12-03 14:39:54.757000             🧑  作者: Mango
在 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++ 类时需要仔细考虑虚函数的声明和重写,以及如何最大化地利用虚函数的多态机制。