是一个对象'这个'指针等于指向其(单个)基类的指针?

时间:2017-12-13 06:33:41

标签: c++ inheritance language-lawyer memory-layout

鉴于以下内容:

class B
{
  // impl here, can be anything valid for a class
};

class D : public B
{
};

void main()
{
  D real;
  D * pd = ℜ
  B * pb = ℜ

  // assert(pb == pd);
  // Edit: I meant:
  assert((void *)pb == (void *)pd);
}

c ++标准pb == pd保证吗?如果不是,在实践中总是这样吗? (假设BD的唯一基类)

1 个答案:

答案 0 :(得分:4)

  

如果没有,实际情况总是这样吗? (假设BD的唯一基类)

不。即使这种假设也无济于事。考虑这个有效的修改:

class D : public B
{
  virtual ~D() = default;
};

D现在是多态的,而B则不是。实际上,这意味着添加了动态调度的指针。通常在对象的开头添加。所以现在B子对象处于偏移量,尽管它是唯一的基础。

值得注意的是,正如@melpomene指出的那样,你的测试仍然会通过。由于D*可隐式转换为B*,因此编译器已在您assert(pb == pd);时为您进行调整。我的观点是,你不能指望重新诠释(我理解你要求对地址进行平面重新解释)是正确的。