有几个问题与此相关,但我仍然不清楚。考虑这个多重继承。
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子对象和Derived共享同一个vtable。这是书中的原话。
“由于Base1是最左边的,它已经指向了Derived类对象的开头”。
这是如何发生的呢?如果我改变继承的顺序,这会改变吗?
class Derived : public Base2, public Base1
但是我不理解编译器是如何实现这一点的。有人能解释一下pbase1和derived如何共享同一个v_table吗?
Derived
类对象的v_table,因为编译器可以在编译时合并Base1
和Base2
的v_tables。这有什么奇怪的呢? - Germán Diago