看下面的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/

10-08 22:39