Как создать иерархию наследования алмазов, если я не могу изменить все базовые классы?C++

Программы на C++. Форум разработчиков
Anonymous
Как создать иерархию наследования алмазов, если я не могу изменить все базовые классы?

Сообщение Anonymous »

У меня возникли трудности с решением ужасной проблемы с алмазами.
Напоминаю, вот классическая иерархия классов этой проблемы:

Код: Выделить всё

    B
/ \
C1   C2
\ /
D
Чтобы решить эту проблему, стандартным решением является заставить C1 и C2 использовать виртуальное наследование для наследования от B.

Моя проблема в том, что B и C1 взяты из SDK, который я не могу изменить.
Пример ниже, где я не могу заставить SubClassB виртуально наследовать от Base.
Классы: PureVirtualBase, Base и SubClassB взяты из используемого мной SDK. Я не могу их изменить.
SubClassA и Leaf — мои собственные классы. Я могу их изменить.

Код: Выделить всё

     PureVirtualBase(SDK)
|
Base(SDK)
/        \
SubClassA   SubClassB(SDK)
\        /
Leaf
В такой ситуации, когда SubClassB нельзя изменить для использования виртуального наследования от Base. Что нужно сделать, чтобы:
  • Экземпляр Leaf содержал только одну Base
  • Избегайте двусмысленности при попытке доступа к функциям, определенным в чисто виртуальном виде в PureVirtualBase и реализованным в BaseBase

Код: Выделить всё

class PureVirtualBase
{
public:
PureVirtualBase()
{
cout

Подробнее здесь: [url]https://stackoverflow.com/questions/10027053/how-to-create-a-diamond-inheritance-hierarchy-when-i-cannot-modify-all-of-the-ba[/url]

Вернуться в «C++»