MST
星途 面试题库

面试题:C++ 中虚指针与虚函数表的关系及工作原理

请阐述在 C++ 中,虚指针是如何与虚函数表配合来实现多态的?当一个类继承自含有虚函数的基类时,虚指针和虚函数表会发生怎样的变化?
40.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 虚指针与虚函数表实现多态的原理
    • 虚函数表(vtable):当一个类中定义了虚函数时,编译器会为该类创建一个虚函数表。虚函数表是一个存储类的虚函数地址的数组。每个虚函数在虚函数表中都有一个对应的条目,该条目存储了虚函数的实际地址。
    • 虚指针(vptr):每个包含虚函数的类的对象都有一个虚指针。虚指针指向该对象所属类的虚函数表。在对象构造时,虚指针被初始化,使其指向对应的虚函数表。
    • 多态实现:当通过基类指针或引用调用虚函数时,程序会首先通过虚指针找到虚函数表,然后根据虚函数表中存储的函数地址来调用实际的虚函数。这样,不同派生类对象即使通过基类指针或引用调用同一个虚函数,也会根据对象实际的类型调用各自的虚函数实现,从而实现多态。
  2. 类继承自含有虚函数的基类时虚指针和虚函数表的变化
    • 虚指针:派生类对象同样包含一个虚指针,在派生类对象构造时,虚指针首先被初始化为指向基类的虚函数表,然后在派生类构造函数中会被重新初始化,指向派生类自己的虚函数表(如果派生类有自己的虚函数实现或新增虚函数)。
    • 虚函数表
      • 覆盖基类虚函数:如果派生类覆盖了基类的虚函数,那么在派生类的虚函数表中,对应基类虚函数的条目会被替换为派生类中覆盖的虚函数的地址。
      • 新增虚函数:如果派生类新增了自己的虚函数,这些虚函数的地址会被添加到派生类虚函数表的末尾。

总之,通过虚指针和虚函数表的这种机制,C++ 实现了运行时多态,使得代码能够根据对象的实际类型调用合适的虚函数。