MST

星途 面试题库

面试题:C++中虚函数表输出内容与多态的关联

请描述在C++中,虚函数表的基本结构。假设我们有一个基类A包含虚函数,一个派生类B继承自A并覆盖了该虚函数,当创建一个B类对象并通过基类指针指向它时,从虚函数表输出内容如何体现多态性?
31.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

虚函数表基本结构

  1. 概念:虚函数表是一个存储虚函数地址的数组,每个包含虚函数的类都有一个对应的虚函数表。当类中定义了虚函数时,编译器会为该类生成一个虚函数表。
  2. 组成:虚函数表中的每一项是一个指向虚函数的指针。对于基类,虚函数表包含基类中定义的虚函数的地址。如果派生类覆盖了基类的虚函数,那么在派生类的虚函数表中,被覆盖的虚函数的条目将被替换为派生类中该虚函数的地址;如果派生类没有覆盖某个虚函数,那么派生类虚函数表中该虚函数条目和基类虚函数表中该虚函数条目指向相同的函数地址。同时,每个对象都有一个虚函数表指针(vptr),该指针指向该对象所属类的虚函数表。

多态性体现

  1. 创建对象及指针指向:当创建一个 B 类对象并通过基类指针 A* ptr = new B(); 指向它时,ptr 所指向对象的虚函数表指针 vptr 指向 B 类的虚函数表。
  2. 调用虚函数:当通过 ptr 调用虚函数时,例如 ptr->virtualFunction();,程序运行时会首先根据 ptr 中的虚函数表指针找到 B 类的虚函数表,然后在虚函数表中找到被调用虚函数的地址,并执行该函数。由于 B 类覆盖了基类 A 的虚函数,此时执行的是 B 类中覆盖后的虚函数,而不是 A 类中的虚函数,这就体现了多态性。从虚函数表输出内容来看,在 B 类虚函数表中,被覆盖虚函数的条目是 B 类中该虚函数的地址,而不是 A 类中虚函数的地址,使得通过基类指针调用虚函数时能根据对象实际类型(这里是 B 类)调用到正确的函数实现,从而实现多态。