看下面的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类的虚表布局是这样的:
我的问题是:
Derived 类的 Base1 子对象的虚表包含 Base2::mumble
。为什么?我知道 Derived 类与 Base1 共享了这个虚表,所以我认为 Base2 的功能不应该出现在这里.谁能告诉我为什么?谢谢。
最佳答案
嗯,首先,我要提醒大家,实现多态性的解决方案的设计是标准之外的 ABI 决策。例如,MSVC 和 Itanium ABI(其次是 gcc、clang、icc 等)有不同的实现方式。
除此之外,我认为这是对查找的优化。
只要您有一个 Derived
对象(或其后代之一)并查找 mumble
成员,您就不需要实际找出 Base2
子对象,但可以直接从 Base1
子对象(其地址与 Derived
子对象一致,因此不涉及算术)。
关于MI的C++虚拟表布局(多重继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921372/