虚函数是怎么实现的

3 分钟阅读 458 字 + 276 词
参考答案
虚函数的实现依赖于一种称为 虚函数表 的机制。
  1. 虚函数表的创建 : 当一个类包含虚函数时,编译器会自动为这个类创建一个虚函数表。这个表是一个函数指针数组,每个指针指向一个虚函数的实现。
  2. 虚函数表指针 : 编译器会在对象的内存布局中添加一个隐式的虚函数表指针(通常是一个指向 vtable 的指针),这样每个对象都可以通过这个指针访问到类的虚函数表。
  3. 虚函数的声明 : 在类中声明虚函数时,可以使用 virtual 关键字。如果一个函数被声明为虚函数,编译器会在类的 vtable 中为这个函数分配一个入口。
  4. 重写虚函数 : 当从基类继承并创建派生类时,可以在派生类中重写基类的虚函数。重写的函数会替换掉 vtable 中对应的基类实现。
  5. 动态绑定 : 当通过基类指针或引用调用虚函数时,程序会使用对象的虚函数表指针来查找正确的函数实现。这个过程称为动态绑定或晚期绑定。
  6. 调用虚函数 : 程序运行时,当调用一个虚函数时,会先通过对象的虚函数表指针找到 vtable ,然后在 vtable 中查找对应的函数指针,并调用该函数。
简短来说,每个类都有一个虚表,里面有这个类的虚函数地址;每个对象都有指向它的类的虚表的指针,这个指针称为虚指针。 当调用虚函数时,编译器会调用对象的虚指针查找虚表,通过虚函数的地址来执行相应的虚函数。