【问题标题】:How does vtable handle multiple inheritance? [duplicate]vtable 如何处理多重继承? [复制]
【发布时间】:2018-09-11 12:22:54
【问题描述】:

我了解,对于单继承,会添加一个指向虚函数表的指针,以确定在运行时调用哪些父类函数。

class Genius {
    int IQ;
public:
    virtual void brag();
};

class Me : public Genius {
    int age;
};

实例化后,Me 的内存布局应该类似于

  pointer to Genius vtable
  int iq
  int age

但是在多重继承的情况下会发生什么呢?

// Assume CoolDude has virtual functions as well
class Me : public Genius, public CoolDude {
    int age;
};

Me 类的内存布局现在是什么样子的?多重继承是如何处理的?

【问题讨论】:

  • 内存布局由实现定义。
  • 更想知道它是如何处理的。欢迎对任何实现进行解释。主要编译器之间的实现真的有很大差异吗?
  • D&E 书中有。

标签: c++ multiple-inheritance vtable


【解决方案1】:

该类将有 2 个指向 vtables 的指针,一个指向它的 Genius 实现,一个指向它的 CoolDude 实现。当转换为基类时,返回的指针将与原始指针的不同之处在于 vtable(和其他成员)或基类的偏移量。

【讨论】:

  • 所以从上到下的内存布局类似于vtable1, vars1, vtable2, vars2, local stuff?
  • 是的,但你自己试试看。
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2011-12-15
  • 2017-12-12
  • 2016-09-21
  • 2020-08-09
  • 2014-01-24
  • 2020-09-23
相关资源
最近更新 更多