面试题答案
一键面试- 类D的虚函数表结构:
- 由于类D多重继承自类B和类C,而类B和类C又继承自类A,类D会有至少两张虚函数表(可能更多,取决于B和C自身是否有额外虚函数)。
- 其中一张虚函数表(假设为虚函数表1)对应从类B继承的部分,这张表中首先包含类A的虚函数指针(因为B继承自A),如果B有自己新的虚函数,也会依次排列在后面。
- 另一张虚函数表(假设为虚函数表2)对应从类C继承的部分,同样先包含类A的虚函数指针(因为C继承自A),若C有自身新的虚函数,也会顺序排列其后。
- 调用类D对象虚函数的查找和调用流程:
- 编译期:编译器根据调用虚函数的对象的静态类型和函数名确定虚函数的标识符。
- 运行期:
- 当通过类D对象调用虚函数时,首先根据对象的内存布局找到对应的虚函数表指针。如果调用的虚函数是从类B继承来的,就通过指向从B继承部分的虚函数表指针找到虚函数表1;如果是从类C继承来的,就通过指向从C继承部分的虚函数表指针找到虚函数表2。
- 在对应的虚函数表中,根据虚函数在表中的偏移量找到具体的虚函数地址。这个偏移量是在编译期确定的,与虚函数在虚函数表中的顺序有关。
- 最后,通过找到的虚函数地址调用实际的虚函数。