面试题答案
一键面试- 虚成员函数对基类对象内存结构的影响:
- 当一个C++类定义了虚成员函数时,该类的对象内存布局中会增加一个虚函数表指针(vptr)。这个指针通常位于对象内存布局的开头(在32位系统下为4字节,64位系统下为8字节)。
- 虚函数表(vtable)是一个存放虚函数地址的数组,类中的每个虚成员函数在虚函数表中都有一个对应的条目,存放其函数地址。这样,通过对象的虚函数表指针可以找到该类的虚函数表,进而找到对应的虚函数进行调用。
- 多态性的实现机制:
- 当通过基类指针或引用调用虚函数时,程序运行时会根据对象实际的类型(即动态类型)来确定调用哪个函数。具体过程是:首先通过对象的虚函数表指针找到对应的虚函数表,然后根据虚函数在表中的索引找到实际要调用的函数地址,最后进行函数调用。这种运行时确定函数调用的机制实现了多态性。
- 派生类重写虚函数时内存布局的变化:
- 派生类对象内存布局仍然包含基类部分和派生类新增部分。基类部分同样包含虚函数表指针(vptr),该指针指向派生类的虚函数表。
- 当派生类重写了虚函数时,派生类的虚函数表中对应虚函数的条目会被替换为派生类重写的虚函数地址。而未被重写的虚函数,其在派生类虚函数表中的条目仍然指向基类的虚函数地址。这样,当通过基类指针或引用调用被重写的虚函数时,就会调用到派生类重写的版本,实现了多态。