С учетом кода:
#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), по-видимому, запрещает это, и если это действительно так, то возникает следующий вопрос: не дано ли нам никаких средств для точного виртуального манипулирования структурой подобъекта и почему