看下面的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;
};
The 《Inside of C++ Object Model 》4.2 says that the virtual table layout of class Base1,Base2 and Derived is like this:
我的问题是:
Derived 类的 Base1 子对象的虚表包含Base2::mumble
为什么?我知道Derived类与Base1共享这个虚表,所以我认为Base2的函数不应该出现在这里。有人能告诉我为什么吗?谢谢。
好吧,首先,我要提醒大家,实现多态性的解决方案的设计是标准之外的 ABI 决策。例如,MSVC 和 Itanium ABI(随后是 gcc、clang、icc...)有不同的方法来实现这一点。
排除了这一点,我认为这是对查找的优化。
每当你有一个Derived
对象(或其后代之一)并查找mumble
会员,您不需要真正找出Base2
子对象,但可以直接从Base1
子对象(其地址与Derived
子对象,因此不涉及算术)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)