是否可以安全地假定在非虚拟单继承类层次结构(涉及或不涉及模板)中,子类和父类的基类指针相同?根类的第一个成员也始终位于同一位置(第一个隐含第二个,但这是我主要关注的问题)。
struct parent {
int type_ = 0;
parent(int type):type_(type) {}
};
struct child: parent {
child():parent(1) {}
};
child ch;
printf("parent %p\r\n", &static_cast<parent&>(ch).type_);
printf("child %p\r\n", &static_cast<child&>(ch).type_); // :)
从我的C++-fu,常识和测试来看,它应该是正确的,但我正在寻找符合和C++标准的答案,以使我感到舒适。 :)
PS :请参阅ideone.com上的代码。
最佳答案
您的两个类都是“标准布局类” 的示例。标准规定,此类必须与C
样式的内存布局兼容。这意味着,指向类对象的指针始终与指向类的第一个数据成员的指针相同。因此,是的,它是标准强制要求的。 (我现在正在尝试查找对“standard-layout类” 的引用)。
编辑 :(定义取自this question,我手边没有Standard,抱歉)
标准布局类是这样的类:
这种类型的数组)或引用,没有虚函数(10.3)
且没有虚拟基类(10.1),
成员
成员(member)。
关于c++ - 非虚拟单继承类层次结构中的基本指针一致性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22236142/