MST

星途 面试题库

面试题:C++ 中虚函数表在不同继承场景下的存储位置变化

在C++中,有一个基类Base包含虚函数,然后有一个派生类Derived继承自Base并覆盖了部分虚函数。请描述在这两种类的对象实例化时,虚函数表分别存储在何处,以及在派生类对象内存布局中虚函数表的位置和作用。
24.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 虚函数表存储位置
    • Base类对象:虚函数表存储在程序的只读数据段(通常是.rodata段)。当Base类对象实例化时,对象的内存布局中会有一个虚函数表指针(vptr),该指针指向这个只读数据段中的虚函数表。
    • Derived类对象:Derived类也有自己的虚函数表,同样存储在程序的只读数据段。Derived类对象内存布局中同样有一个虚函数表指针(vptr)指向其对应的虚函数表。
  2. 派生类对象内存布局中虚函数表的位置
    • 在派生类对象的内存布局中,虚函数表指针(vptr)通常位于对象内存布局的起始位置(这是常见的实现方式,不同编译器可能有细微差异)。在vptr之后是从基类继承而来的数据成员(如果有),再之后是派生类自己新增的数据成员。
  3. 派生类对象内存布局中虚函数表的作用
    • 实现多态:虚函数表记录了派生类对基类虚函数的覆盖情况以及派生类自己新增的虚函数。当通过基类指针或引用调用虚函数时,程序会根据对象的虚函数表指针找到对应的虚函数表,然后根据虚函数表中记录的函数地址来调用实际的函数。这样就实现了运行时多态,即根据对象的实际类型(而不是指针或引用的静态类型)来决定调用哪个函数。 例如,如果有一个Base*指针指向一个Derived对象,调用虚函数时,会通过Derived对象的虚函数表指针找到Derived类的虚函数表,从而调用Derived类覆盖后的虚函数。