наследование — C ++ Diamond of Death

Итак, я понимаю, как решить проблему наследства алмаза смерти, когда у вас есть полный контроль над всеми классами, но что, если у вас есть контроль только над последним классом, который наследуется от обоих
Итак, у меня есть это:

class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};

и у меня нет возможности редактировать только B и C, D, есть ли простой способ сделать это?

2

Решение

Поддельные сдерживания. Пусть D содержат B и C и дают D тот же открытый интерфейс, что и объединение открытого интерфейса B и C.
Затем вызовите соответствующие методы B и C из открытого интерфейса D.

Конечно, у вас будут проблемы приведения и полиморфизм, так как он не будет следовать законам наследования.

Короче, хорошего пути нет.

2

Другие решения

Это очень хорошая причина, вы не можете заставить 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?

Виртуальное наследование означает: «Мне нужен этот класс, но мне не понадобятся некоторые допустимые значения для него, и я совершенно в порядке с кем-то еще, возиться с ним».

3

По вопросам рекламы [email protected]