C ++标准是否对继承成员的地址有所说明?例如,如果我继承了一个int成员或一个非虚方法,它是否对它的地址或虚拟成员说了什么:如果我不重复它,如果我这样做?构造函数,如果我使用以前的构造函数?运营商,重载运营商,模板成员?它对这些事情有什么看法吗?
答案 0 :(得分:2)
标准,第1.8节是关于C ++对象模型。
它没有说太多:对象是一个内存区域(但它可能包含未使用的区域以进行对齐)并且可以包含子对象(成员子对象或基类子对象,或者数组子对象) )。根据完整对象的定义,您可以推断出子对象包含在其对象的内存区域中。它说两个既不是位域也不是基类子对象的不同对象应该有不同的地址。
第9.2 / 15节提供了有关对象中addresess顺序的一些其他信息:
具有相同访问权限的(非联合)类的非静态数据成员 控制被分配,以便后来的成员有更高的 类对象中的地址。非静态分配的顺序 具有不同访问控制的数据成员未指定。 实现对齐要求可能会导致两个相邻成员 不要在对方之后立即分配;可能 管理虚拟功能和空间的空间要求 虚拟基类。
当所有联合成员都是以相同的类型序列开始的结构时,有几个关于联合的句子。然后允许“检查公共部分”,从中可以推断出它们必须具有相同的地址。
最后,我在9.2 / 21中找到了最后一个:
指向标准布局结构对象的指针,使用reinterpret_cast进行适当转换,指向其初始成员(或者如果是 成员是一个位字段,然后是它所在的单位)和副 反之亦然。
基本上就是这样。你会看到这里有很多实现定义的东西,关于每个对象的确切布局。
不幸的是,你甚至不能多说基类子对象的地址和它的派生对象:也可能有多重继承。因此,该标准不使用地址假设:它指出了以下内容:“如果基类可访问,则可以隐式地将指向派生类的指针转换为指向该基类的指针” < / p>