c++虚函数表里存储的是函数指针
作者:野牛程序员:2023-08-07 05:09:21 C++阅读 2931
在C++中,虚函数是通过虚函数表(vtable)来实现的。虚函数表是一张用于实现多态性的表,存储了类的虚函数的地址。每个包含虚函数的类都会有一个对应的虚函数表,其中的每个表项对应一个虚函数。
当一个类包含虚函数时,编译器会在该类的对象中添加一个指向虚函数表的指针,通常称为虚函数指针(vptr)。这个指针指向该类的虚函数表的地址。当调用一个虚函数时,实际上是通过虚函数指针找到虚函数表,然后根据函数在虚函数表中的索引来调用正确的虚函数。
虚函数表的结构可以简化为一个由函数指针组成的数组,每个元素对应一个虚函数的地址。当派生类重写虚函数时,它会在虚函数表中用自己的函数指针覆盖基类的函数指针,从而实现动态绑定,确保在运行时调用正确的虚函数。
以下是一个简化的示意图来表示虚函数表的结构:
+---------------------+ | Base vtable | +---------------------+ | &Base::func1 | +---------------------+ | &Base::func2 | +---------------------+ | &Base::func3 | +---------------------+ +---------------------+ | Derived vtable | +---------------------+ | &Derived::func1 | +---------------------+ | &Base::func2 | +---------------------+ | &Derived::func3 | +---------------------+
在上面的示例中,Base类和Derived类都有一个虚函数表。在Derived类中,func1和func3被重写,因此在虚函数表中使用了Derived类的函数指针,而func2没有被重写,仍然使用了Base类的函数指针。这样,当通过基类指针或引用调用虚函数时,根据对象的实际类型,会在对应的虚函数表中查找正确的函数指针来执行函数调用。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:c++虚函数子类必须实现吗
- 下一篇:c++如何声明纯虚函数
