У меня есть алмазная иерархия классов:
A
/ \
B C
\ /
D
Чтобы избежать двух копий A в D, нам нужно использовать виртуальное наследование в B и C.
class A { };
class B: virtual public A {};
class C: virtual public A { };
class D: public B, public C { };
Вопрос: Почему виртуальное наследование должно выполняться в B и C, хотя двусмысленность в D? Это было бы более интуитивно, если бы оно было в D.
Почему эта функция разработана таким же образом комитетом по стандартизации? Что мы можем сделать, если классы B и C поступают из сторонней библиотеки?
EDIT: Мой ответ состоял в том, чтобы указать классы B и C, что они не должны вызывать конструктор всякий раз, когда его производный объект создается, поскольку он будет вызываться D.