MST

星途 面试题库

面试题:C++ 类的内存布局与虚函数机制

假设存在一个继承体系,基类包含虚函数,派生类重写了该虚函数。请描述这个继承体系中对象的内存布局是怎样的,虚函数表在其中起到什么作用,以及程序在运行时如何通过虚函数表来调用虚函数。
12.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 对象内存布局
    • 基类对象
      • 基类对象包含自身的数据成员。如果有虚函数,还会包含一个虚指针(vptr)。虚指针指向虚函数表(vtable)。
    • 派生类对象
      • 派生类对象首先包含基类部分的数据成员和虚指针(如果基类有虚函数),这部分与基类对象布局相同。然后是派生类自身新增的数据成员。如果派生类重写了基类的虚函数,虚函数表中的相应条目会被替换为派生类重写的虚函数地址。
  2. 虚函数表的作用
    • 虚函数表是一个存储虚函数地址的数组。每个包含虚函数的类(或从包含虚函数的类派生而来的类)都有一个虚函数表。它的作用是为运行时多态性提供支持。当通过基类指针或引用调用虚函数时,程序可以根据对象实际的类型(在运行时确定),从虚函数表中找到正确的虚函数地址并调用。
  3. 通过虚函数表调用虚函数的过程
    • 当通过基类指针或引用调用虚函数时:
      • 首先,程序根据对象的内存布局找到虚指针(vptr),虚指针指向虚函数表。
      • 然后,根据调用的虚函数在虚函数表中的索引位置,找到对应的虚函数地址。不同的虚函数在虚函数表中有不同的索引。
      • 最后,程序跳转到找到的虚函数地址处执行该虚函数的代码。例如,如果基类指针实际指向一个派生类对象,派生类重写了虚函数,那么虚函数表中对应条目的地址就是派生类虚函数的地址,程序就会执行派生类的虚函数代码。