MST
星途 面试题库

面试题:C++多继承下的虚函数表与指针偏移

在C++多继承环境下,当一个类从多个基类继承虚函数时,虚函数表是如何构建的?同时,对象的指针偏移在多继承场景中会出现什么情况,如何理解和处理这种情况?
29.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

虚函数表在C++多继承环境下的构建

  1. 单一虚函数表:在单继承中,每个有虚函数的类只有一个虚函数表(vtable),表中存放着类的虚函数地址。
  2. 多继承下的虚函数表:在多继承时,类会有多个虚函数表,每个虚函数表对应一个直接基类。假设有类Derived继承自Base1Base2Base3,且这些类都有虚函数。那么Derived对象的内存布局中会有与Base1Base2Base3相对应的虚函数表。Derived类重写的虚函数,会在对应的基类虚函数表中更新其地址;如果Derived没有重写某个基类的虚函数,虚函数表中就保存基类虚函数的地址。

对象指针偏移在多继承场景中的情况

  1. 指针偏移现象:由于多继承下对象内存布局包含多个基类子对象,不同基类子对象在内存中的起始位置不同。当使用指向派生类对象的指针进行类型转换时,指针需要进行偏移以正确指向不同基类子对象。例如,假设有Derived继承自Base1Base2Base1Base2有不同的大小和内存布局。Derived对象中Base1子对象和Base2子对象位置不同,若有Derived* d = new Derived(); Base1* b1 = d; Base2* b2 = d;b1b2实际指向Derived对象内不同位置,编译器会自动调整指针偏移。
  2. 理解与处理:理解这种偏移是基于对象内存布局的原理,编译器为了保证正确的多态行为和对象访问进行指针调整。在实际编程中,尽量使用dynamic_cast进行类型转换,它会在运行时检查类型安全性并正确处理指针偏移。避免使用static_cast进行不安全的指针转换,以免导致未定义行为。若要手动处理指针偏移,需要非常清楚对象的内存布局,这通常很复杂且容易出错,所以依赖编译器的自动处理和dynamic_cast更为可靠。