是否可以安全地假定在非虚拟单继承类层次结构(涉及或不涉及模板)中,子类和父类的基类指针相同?根类的第一个成员也始终位于同一位置(第一个隐含第二个,但这是我主要关注的问题)。

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),
  • 对所有非静态数据具有相同的访问控制(条款11)
    成员
  • 没有非标准布局的基类
  • 在最大派生类中没有非静态数据成员,并且最多一个具有非静态数据成员的基类,或者在无基类中具有非静态数据成员,并且
  • 没有与第一个非静态数据相同类型的基类
    成员(member)。
  • 关于c++ - 非虚拟单继承类层次结构中的基本指针一致性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22236142/

    10-10 21:29