MI的C ++虚拟表格布局是怎样的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

看看下面的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.Why?我知道Derived类与Base1共享这个虚拟表,所以我认为Base2的功能不应该出现在这里。有人告诉我为什么?

提问于
用户回答回答于

试试这样的代码吧:

    Base2 b2;
    Base1* b1_ptr = (Base1*)&b2;
    b1_ptr->mumble();    // will call Base2::mumble(), this is the reason.
用户回答回答于

首先,我会提醒大家,实现多态的解决方案的设计是标准之外的ABI决策。例如,MSVC和Itanium ABI有不同的实现方法。

通过这种方式,我认为这是对查找的优化。

每当你有一个Derived对象并查找mumble成员时,你不需要真正找出Base2子对象,但可以直接从Base1子对象作用。

扫码关注云+社区

领取腾讯云代金券