admin 管理员组

文章数量: 887021


2023年12月25日发(作者:香港明星特斯拉事件)

c++11 虚函数表原理

C++的虚函数表(vtable)是C++实现多态性的一种重要机制。虚函数表本质上是一个函数指针数组,每个类都会有一个与之关联的虚函数表。

以下是虚函数表的基本原理:

虚函数:在C++中,如果一个成员函数在基类中被声明为虚函数,那么在派生类中,该函数会被重写。这意味着当通过基类指针或引用调用该函数时,会调用派生类中的版本,而不是基类中的版本。

虚函数表:每个包含虚函数的类都会有一个与之关联的虚函数表。这个表是一个函数指针数组,数组中的每个元素都是指向类中某个虚函数的指针。

虚指针:在每个包含虚函数的类的对象中,都会有一个虚指针(vptr),它指向类的虚函数表。当通过基类指针或引用调用虚函数时,会先通过虚指针找到对应的虚函数表,然后根据函数的偏移量找到正确的函数进行调用。

动态绑定:由于虚函数表的存在,C++可以在运行时根据对象的实际类型确定要调用的函数,这就是所谓的动态绑定或晚期绑定。

以下是虚函数表的基本使用和创建过程:

cpp

class Base {

public:

virtual void foo() {}

};

class Derived : public Base {

public:

void foo() override {}

};

int main() {

Base* base = new Derived;

base->foo(); // 实际上会调用Derived类的foo()方法

delete base;

return 0;

}

foo函数在Base类中被声明为虚函数,然后在Derived类中被重写。当我们通过Base类的指针调用foo函数时,会根据对象的实际类型(在这里是Derived)来调用正确的版本。这就是多态性的体现。


本文标签: 函数 调用 指针 基类 数组