MST

星途 面试题库

面试题:C++虚函数多态在复杂继承体系中的应用

假设有一个多层继承的C++类体系,基类A有一个虚函数func()。中间类B继承自A并覆盖func(),最终派生类C继承自B也覆盖func()。当通过一个指向C对象的A类型指针来调用func()时,描述整个函数查找和调用的过程,包括编译器和运行时分别做了哪些操作。
34.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 编译器操作
    • 编译器在编译时,看到通过 A 类型指针调用 func() 函数。由于 func() 是虚函数,编译器不会直接生成调用具体函数的代码,而是生成通过虚函数表指针(vptr)间接调用函数的代码。
    • 编译器为每个包含虚函数的类(这里的 ABC)生成一个虚函数表(vtable)。虚函数表是一个函数指针数组,每个元素指向类中虚函数的实际实现。
    • A 的虚函数表中,func() 对应的表项指向 A::func() 的实现。当 B 覆盖 func() 时,B 的虚函数表中 func() 对应的表项指向 B::func() 的实现。同理,C 的虚函数表中 func() 对应的表项指向 C::func() 的实现。
    • 对于每个对象,编译器在对象的内存布局中添加一个虚函数表指针(vptr),该指针指向对应类的虚函数表。
  2. 运行时操作
    • 当程序运行到通过 A 类型指针调用 func() 时,首先根据该指针找到对应的对象。因为对象内存布局中第一个成员就是虚函数表指针(vptr),通过这个 vptr 找到对象所属类(这里是 C 类)的虚函数表。
    • C 类的虚函数表中,找到 func() 对应的函数指针。由于 C 覆盖了 func(),虚函数表中 func() 对应的指针指向 C::func() 的实现。
    • 最后,通过找到的函数指针调用 C::func() 函数。