У меня есть ромбовидная иерархия классов:
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.
Почему эта функция разработана таким образом комитетом по стандартам? класс A {}; class B: ...
У меня есть ромбовидная иерархия классов:
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.
Почему эта функция разработана таким образом комитетом по стандартам? класс A {}; class B: ...
У меня есть ромбовидная иерархия классов:
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 поступают из сторонней библиотеки?
РЕДАКТИРОВАТЬ: Мой ответ заключался в том, чтобы указать классы B и C, что они не должны вызывать конструктор A всякий раз, когда создается его производный объект, поскольку он будет вызываться D.