Итак, я понимаю, как решить проблему наследства алмаза смерти, когда у вас есть полный контроль над всеми классами, но что, если у вас есть контроль только над последним классом, который наследуется от обоих
Итак, у меня есть это:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
и у меня нет возможности редактировать только B и C, D, есть ли простой способ сделать это?
Поддельные сдерживания. Пусть D содержат B и C и дают D тот же открытый интерфейс, что и объединение открытого интерфейса B и C.
Затем вызовите соответствующие методы B и C из открытого интерфейса D.
Конечно, у вас будут проблемы приведения и полиморфизм, так как он не будет следовать законам наследования.
Короче, хорошего пути нет.
Это очень хорошая причина, вы не можете заставить B
а также C
делиться A
, Рассматривать:
struct A {int i;};
struct B : A {
B(){i=3;}
void foo() {
//crash if i!=3
}
};
struct C : A {
C(){i=4;}
void bar() {
//crash if i!=4
}
};
B
а также C
хорошие классы. Они не могут справиться с ситуацией, в которую они не попадут (недопустимое значение i).
Если бы был способ сделать то, что вы просите (struct D:B,C
, где B
а также C
доля A
), какова будет стоимость D::A::i
?
Виртуальное наследование означает: «Мне нужен этот класс, но мне не понадобятся некоторые допустимые значения для него, и я совершенно в порядке с кем-то еще, возиться с ним».