关于这个有几个问题。但我仍然不清楚这一点。考虑这种多重继承。
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;
};
并考虑这两个陈述
Base1 *pbase1 = new Derived;
Base2 *pbase2 = new Derived;
C++ 对象模型里面的书在其中一个优化中说明了这一点。
pbase1 子对象的 vtable 和 Derived 共享同一个 vtable。书中的确切短语
“Base 1 在最左边,它已经指向 Derived 类对象的开头”
这是怎么发生的?我知道如果我将继承顺序更改为
class Derived : public Base2, public Base1
但我不明白编译器是如何完成的。任何人都可以解释 pbase1 和派生如何共享同一个 v_table 吗?