看下面的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;
};
《 C++对象模型内部》 4.2说,Base1,Base2和Derived类的虚拟表布局如下:
我的问题是:
为什么派生类的Base1子对象的虚拟表包含
Base2::mumble
。为什么?我知道派生类与Base1共享了该虚拟表,所以我认为Base2的功能不应出现在这里。有人可以告诉我为什么吗?谢谢。 最佳答案
好吧,首先,我会提醒大家,实现多态性的解决方案的设计是标准之外的ABI决定。例如,MSVC和Itanium ABI(后接gcc,clang,icc等)具有不同的实现方式。
有了这一点,我认为这是对查找的优化。
每当您有一个Derived
对象(或其后代之一)并查找mumble
成员时,您无需实际查找Base2
子对象,而是可以直接从Base1
子对象中进行操作(其地址与Derived
子对象一致,因此无需进行任何算术运算)。
关于c++ - MI的C++虚拟表布局(多重继承),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15921372/