Как создать иерархию наследования алмазов, если я не могу изменить все базовые классы?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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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