С++: когда уместно использовать множественное наследование (когда это неуместно и используется)

Возможный дубликат:
использование множественного наследования?

Как множественное наследование действительно полезная конструкция в C++. Зачем это использовать? Каковы примеры того, как он может решить проблемы, которые не могут быть решены каким-либо другим чистым способом? Каковы некоторые примеры того, как использовать его с пользой? Как это используется не по назначению? Какие проблемы с этим? Почему людям это не нравится?


person Philip Schlump    schedule 23.12.2009    source источник
comment
Я думаю, рассказанная здесь история дает хорошее представление о том, почему люди его ненавидят: joelonsoftware. com/items/2009/09/23.html   -  person Amber    schedule 23.12.2009
comment
Это дубликат. См. раздел stackoverflow.com/questions/573913/. .   -  person jason    schedule 23.12.2009
comment
Еще один дуп. См. stackoverflow.com/questions/1094039/   -  person Jeff L    schedule 23.12.2009


Ответы (2)


В MI нет ничего плохого, просто в реализации C++. Если вы наследуете только интерфейс или только реализацию одной вещи (частно), у вас не будет никаких проблем. Если вы делаете и то, и другое в одном и том же базовом классе, проблем избежать очень сложно.

person Charles Eli Cheese    schedule 23.12.2009

Что ж, наследование определяет отношение «является», поэтому вы должны использовать множественное наследование, когда класс «является» несколькими разными вещами. Например, двухсторонняя очередь является одновременно «BackInsertable» и «FrontInsertable». BackInsertable может вызвать требование для метода push_back, а также для FrontInsertable и push_front. Без множественного наследования вам пришлось бы иметь суперклассы для BackInsertable, FrontInsertable и BackAndFrontInsertable. Очевидно, что это плохо масштабируется, когда вы добавляете больше сложности.

Проблемы с множественным наследованием возникают, когда два суперкласса определяют одни и те же переменные-члены или когда вы сталкиваетесь с проблемой алмаза (D1 и D2 наследуют B, а D3 наследует D1 и D2, наследуя B дважды).

Людям это не нравится, потому что очень легко случайно столкнуться с этими проблемами. Как сказал Антигуру, дело не столько в том, что людям не нравится множественное наследование, им просто не нравится его реализация на С++ (и, конечно, есть люди, которые вообще ненавидят объектно-ориентированное программирование, и для них множественное наследование - чистое зло).

person Peter Alexander    schedule 23.12.2009