面试题答案
一键面试- 对象内存布局
- 基类对象:
- 基类对象包含自身的数据成员。如果有虚函数,还会包含一个虚指针(vptr)。虚指针指向虚函数表(vtable)。
- 派生类对象:
- 派生类对象首先包含基类部分的数据成员和虚指针(如果基类有虚函数),这部分与基类对象布局相同。然后是派生类自身新增的数据成员。如果派生类重写了基类的虚函数,虚函数表中的相应条目会被替换为派生类重写的虚函数地址。
- 基类对象:
- 虚函数表的作用
- 虚函数表是一个存储虚函数地址的数组。每个包含虚函数的类(或从包含虚函数的类派生而来的类)都有一个虚函数表。它的作用是为运行时多态性提供支持。当通过基类指针或引用调用虚函数时,程序可以根据对象实际的类型(在运行时确定),从虚函数表中找到正确的虚函数地址并调用。
- 通过虚函数表调用虚函数的过程
- 当通过基类指针或引用调用虚函数时:
- 首先,程序根据对象的内存布局找到虚指针(vptr),虚指针指向虚函数表。
- 然后,根据调用的虚函数在虚函数表中的索引位置,找到对应的虚函数地址。不同的虚函数在虚函数表中有不同的索引。
- 最后,程序跳转到找到的虚函数地址处执行该虚函数的代码。例如,如果基类指针实际指向一个派生类对象,派生类重写了虚函数,那么虚函数表中对应条目的地址就是派生类虚函数的地址,程序就会执行派生类的虚函数代码。
- 当通过基类指针或引用调用虚函数时: