符合C++标准的多态对象的存储布局

Storage layout of polymorphic objects according to C++ standard

我知道如果 class 包含任何虚函数,大多数编译器(如果不是全部)都会添加一个指向其对象的 vptr 指针。有些人将其添加为第一个元素,有些人将其添加为最后一个。但 C++ 标准是否强制使用 vptr 和 vtable?理论上,任何编译器都可以以任何其他方式实现它吗?如果是这样,关于多态对象的存储布局和整体大小的保证是什么(例如,所有显式定义的字段(+填充)是否在一个连续的内存块中)?

我不知道这在各种 C++ 标准之间是否不同,这就是为什么我只添加了通用的 C++ 标记。

C++ 标准中没有任何内容要求特定的虚拟继承实现。虚拟继承的语义是根据适当的语法和预期的结果指定的。 C++ 实现可以自由使用任何产生这些结果的技术实现。

例如,让我们从整个基类的虚拟继承开始 classes:

[class.mi]

A base class specifier that contains the keyword virtual specifies a virtual base class. ... For each distinct base class that is specified virtual, the most derived object shall contain a single base class subobject of that type.

该标准将语法 virtual 定义为引入基 class 的虚拟继承,以及预期结果:最派生对象包含虚拟继承基 [=28] 的单个实例=].句号。故事结局。一个特定的实现是如何做到这一点的,超出了标准的范围。

同样,对于单个虚函数:

[class.virtual]

If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or indirectly from Base ... [ a few more requirements ] ... then Derived::vf ... overrides Base::vf.

省略了一些技术要求。该标准仅指定派生 class "overrides" 中的虚函数与基 class 中的(相同)函数。一个特定的 C++ 实现是如何做到这一点的,在任何地方都没有指定。