Учитывая код:Несколько экземпляров подобъекта виртуального базового класса (действительно) - никак?
#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) формулировка, по-видимому, запрещает это, и если это действительно так, то следующий вопрос: не даны ли мы никакие средства точной манипуляции с подобъектной виртуальной надмножеством, и Зачем?
Просто избежать наследования нескольких алмазов. Ваши будущие сопровождающие оценят это. –
@Mark Конечно, я избегу этого в любой практической ситуации. Это принципиальный вопрос :) – mlvljr
Для чистых классов интерфейса (т. Е. Абстрактных классов без элементов данных) виртуальное наследование - это правильная вещь. Не виртуальное наследование может привести к неоднозначности позже, в то время как виртуальное наследование безболезненно в этом случае. – celtschk