查看以下C++代码
class Base1 {
public:
Base1();
virtual ~Base1();
virtual void speakClearly();
virtual Base1 *clone() const;
protected:
float data_Base1;
};
class Base2 {
public:
Base2();
virtual ~Base2();
virtual void mumble();
virtual Base2 *clone() const;
protected:
float data_Base2;
};
class Derived : public Base1, public Base2 {
public:
Derived();
virtual ~Derived();
virtual Derived *clone() const;
protected:
float data_Derived;
};
Run Code Online (Sandbox Code Playgroud)
"C++对象模型内部"4.2表示类Base1,Base2和Derived的虚拟表布局如下:


我的问题是:
Base2::mumbleDerived类的Base1子对象的虚拟表包含.为什么?我知道Derived类与Base1共享这个虚拟表,所以我认为Base2的功能不应该出现在这里.有人可以告诉我为什么?谢谢.
首先,我要提醒大家,实现多态的解决方案的设计是标准之外的ABI决策.例如,MSVC和Itanium ABI(后跟gcc,clang,icc,...)有不同的方法来实现它.
有了这个,我认为这是一个查找优化.
每当你有一个Derived对象(或它的一个后代)并查找该mumble成员时,你不需要实际找到Base2子对象,但可以直接从Base1子对象(其地址与Derived子对象一致,因此不涉及算术)进行操作.