MI的C++虚拟表布局(多重继承)

标签 c++ oop

看下面的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类的虚表布局是这样的: enter image description here

enter image description here

我的问题是:

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/

相关文章:

c++ - 连续调用临时对象的方法

php - 在 PHP 中获取对象的内存大小?

oop - 如何建立面向对象的技能?

oop - 如何在 julia 中创建一个 "single dispatch, object-oriented Class",其行为类似于具有公共(public)/私有(private)字段和方法的标准 Java 类

c++ - 运算符 [] 是否接受 C++ 中除整数以外的类型?

java - 继承 : using base class or derived class to do stuff

c++ - C2259 错误 (directx 11)

c++ - PVOID buffer转PCHAR有什么意义?

c++ - 在 9 个资源的 0 到 8 索引中,应该使用哪个纹理槽开始我需要第 7 和第 8 个槽的位置

c++ - C/C++ 将编码设置为 UNICODE.. 如何将 'ă' 写入文件