继承成员地址的C++标准

C++ Standard On The Address of Inherited Members

本文关键字:C++ 标准 地址 成员 继承      更新时间:2023-10-16

C++标准对继承成员的地址有什么规定吗?例如,如果我继承了一个int成员或一个非虚拟方法,它是否说明了它的地址或虚拟成员:如果我不覆盖它,如果我覆盖了它?构造函数,如果我使用以前的构造函数?运算符、重载运算符、模板成员?上面有关于这些事情的内容吗?

标准,第1.8节是关于C++对象模型的。

它没有说太多:对象是一个内存区域(但出于对齐目的,它可能包含未使用的区域),并且可以包含子对象(成员子对象或基类子对象,或数组子对象)。根据完整对象的定义,可以推断子对象包含在其对象的内存区域中。它还说,两个既不是位域也不是基类子对象的不同对象应该有不同的地址。

第9.2/15节提供了一些关于对象内地址顺序的附加信息:

具有相同访问权限的(非并集)类的非静态数据成员分配控件,以便以后的成员具有更高的类对象中的地址。非静态的分配顺序未指定具有不同访问控制的数据成员。实施一致性要求可能导致两个相邻成员不得紧接在一起分配;所以可能管理虚拟功能和虚拟基类。

当所有的并集成员都是以相同类型序列开头的结构体时,有几个关于并集的句子。然后允许"检查公共部分",从中可以推断出它们必须具有相同的地址。

最后,我在9.2/21:中找到了最后一个

一个指向标准布局结构对象的指针,使用repret_cast进行适当转换,指向其初始成员(或者如果成员是一个位字段,然后指向它所在的单元),反之亦然反之亦然。

基本上就是这样。你可以看到这里有很多实现定义的东西,关于每个对象的确切布局。

不幸的是,您甚至不能对基类子对象及其派生对象的地址说太多:也可能存在多重继承。因此,该标准不使用地址假设:它声明了以下内容:"如果基类是可访问的,则可以隐式地将指向派生类的指针转换为指向该基类的指针"