vtable如何处理多重继承?

How does vtable handle multiple inheritance?

我了解对于单继承,添加了一个指向虚函数 table 的指针以确定在运行时调用哪些父 class 函数。

class Genius {
    int IQ;
public:
    virtual void brag();
};

class Me : public Genius {
    int age;
};

实例化时,Me 的内存布局应该类似于

  pointer to Genius vtable
  int iq
  int age

但是在多重继承的情况下会发生什么?

// Assume CoolDude has virtual functions as well
class Me : public Genius, public CoolDude {
    int age;
};

现在 Me class 的内存布局是什么样的?如何处理多重继承?

class 将有 2 个指向 vtables 的指针,一个指向 Genius 的实现,一个指向 CoolDude 的实现。当强制转换为基数 class 时,返回的指针将与原始指针的差异在于 vtable(和其他成员)或基数 class 的偏移量。