面试题答案
一键面试虚基类的作用
在C++继承体系中,虚基类主要用于解决菱形继承(又称钻石继承)带来的问题。菱形继承会导致从多个路径继承而来的相同基类子对象在派生类中出现重复,从而造成数据冗余和访问歧义。虚基类通过使得在继承体系中无论经过多少条路径,派生类最终都只会保留一份虚基类的子对象,避免了重复数据问题,为继承体系提供了一种共享基类子对象的机制。
编译器实现虚基类机制避免重复数据问题的方式
- 偏移量调整:编译器通过调整虚基类子对象在派生类对象中的偏移量来实现。当存在虚基类时,派生类对象的布局会有所变化,编译器会引入一个虚基类表指针(vbtptr),该指针指向一个虚基类表(vbtable)。虚基类表中记录了虚基类子对象相对于派生类对象起始地址的偏移量。
- 构造函数处理:在构造派生类对象时,编译器会确保虚基类子对象首先被构造,且只会被构造一次。这通常是通过在派生类的构造函数初始化列表中显式调用虚基类的构造函数来实现的,并且这个调用会被传播到整个继承体系中,使得虚基类的构造函数在整个继承层次结构中只被调用一次。
- 访问控制:在访问虚基类成员时,编译器利用虚基类表指针和虚基类表中的偏移量信息,准确计算出虚基类子对象在派生类对象中的位置,从而实现对虚基类成员的正确访问,避免了由于重复数据导致的访问歧义。