【发布时间】:2017-12-13 06:33:41
【问题描述】:
鉴于以下情况:
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);
}
pb == pd 是否由 c++ 标准保证?如果不是,在实践中是否总是如此? (这是假设B 是D 的唯一基类)
【问题讨论】:
-
不,不是。考虑一个将基类成员放在末尾而不是开头的实现。合法的。奇怪,但合法。
-
同时考虑多重继承。
-
或者不是 MI,但如果它是虚拟继承(这种情况下很可能将基础放置在末尾),但是对于单个非虚拟基础,断言很可能是真的.我很确定只有在 std::is_standard_layout 为真时才能保证。
-
是的,保证
pb == pd。如果要保证(void*)pb == (void*)pd,那么不行,这个绝对不能保证。 -
是的,阅读整个标准。在任何地方都找不到保证。不了解“始终在实践中”,我无法在所有情况下尝试所有编译器。
标签: c++ inheritance language-lawyer memory-layout