给定代码:
#include <cassert>
struct X {};
struct Y1: virtual X {};
struct Y2: virtual X {};
struct Y3: virtual X {};
struct Y4: virtual X {};
struct Z1: Y1, Y2 {};
struct Z2: Y3, Y4 {};
struct XYZ: Z1, Z2 {};
int main() {
XYZ xyz;
X *x1 = static_cast<Y1*>(&xyz);
X *x2 = static_cast<Y2*>(&xyz);
X *x3 = static_cast<Y3*>(&xyz);
X *x4 = static_cast<Y4*>(&xyz);
assert( x1 == x2 ); //first pair, ok
assert( x2 == x3 ); //can we make this one fail?
assert( x3 == x4 ); //second pair, ok
return 0;
}
我们可以让第二个断言失败吗?
换句话说,当我们有一个双菱形继承图并希望在派生最多的对象中为两个菱形的顶部有单独的子对象时,就是这种情况。
标准 (2003, 10.1.4) 的措辞似乎禁止这样做,如果确实如此,那么后续问题是:我们是否没有提供精确的虚拟多乘包含子对象结构操作的方法,为什么?