Реализация проекта множественного наследования - PullRequest
0 голосов
/ 13 октября 2011

У меня есть 3 класса, A, B и C, где B - это A, а C - это A.

Эти классы предназначены для сохранения истории, поэтому A предоставляет виртуальный метод, который могут создавать производные классы для уведомления о необходимости архивирования истории, который называется void archive().

Теперь внезапно возникает необходимость собрать информацию из A, B и C в одном классе, и я не уверен, что лучший подход.

Я думал о создании нового класса D, который наследуется от B и C, и изменении их наследования на virtual public A, чтобы избежать проблемы с бриллиантами и иметь D::archive() просто для вызова B::archive() и C::archive().

Это хороший подход? Или я должен перепроектировать 4 класса так, чтобы я не использовал множественное наследование?

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

Как насчет использования композиции вместо?
Например. class D делегаты классам B и C вместо наследования.
Композиция может достичь тех же результатов, а код намного проще (ИМХО)

5 голосов
/ 13 октября 2011

Ваш подход стандартный.C ++ имеет множественное наследование, и вы можете свободно использовать его.Похоже, вы знаете, как это сделать правильно.

1 голос
/ 13 октября 2011

Остерегайтесь цепочки вызовов, которые могут иметь возможные методы переопределения: если B::method вызывает A::method и C::method вызывает A::method, когда вы соединяете их вместе в D, делая A виртуальным, если D::method вызывает обаC::method и B::method, вам звонят A::method дважды.

Когда база становится виртуальной, вы должны избегать таких повторных входов.

0 голосов
/ 13 октября 2011

У вас может быть D, полученное из A, содержащее два члена B и C. D :: архив будет вызывать B :: архив и C :: архив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...