鉴于以下内容:
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
是保证吗?如果不是,在实践中总是这样吗? (假设B
是D
的唯一基类)
答案 0 :(得分:4)
如果没有,实际情况总是这样吗? (假设
B
是D
的唯一基类)
不。即使这种假设也无济于事。考虑这个有效的修改:
class D : public B
{
virtual ~D() = default;
};
D
现在是多态的,而B
则不是。实际上,这意味着添加了动态调度的指针。通常在对象的开头添加。所以现在B
子对象处于偏移量,尽管它是唯一的基础。
值得注意的是,正如@melpomene指出的那样,你的测试仍然会通过。由于D*
可隐式转换为B*
,因此编译器已在您assert(pb == pd);
时为您进行调整。我的观点是,你不能指望重新诠释(我理解你要求对地址进行平面重新解释)是正确的。