Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
#1

Множественное наследование - так ли это плохо? - C++

29.07.2014, 07:03. Просмотров 1271. Ответов 11
Метки нет (Все метки)

Вопрос не в том, что это такое и пр. С момента изучения Си++ во всех книжках все авторы (кроме самого Страуструпа) пишут, что множественное наследование - бяка и фу. Мне лично глубоко пофигу на эти общие соображения.

Вопрос: может ли кто-то привести пример (желательно из личной практики), где применение множественного наследования было бы самым удачным с точки зрения дизайна и/или производительности решением? Или всё-таки всегда-всегда можно заменить наследование композицией (ну или каким-нибудь паттерном twin)?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
29.07.2014, 19:11     Множественное наследование - так ли это плохо? #2
Могу привести полезны и безопасный пример. Микс-ины: в данном контексте под ними понимаются служебные классы, обеспечивающие наличие (или отсутствие) какого-то свойства. Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class NonCopyable{
private: NonCopyable(const NonCopyable&);  // Или даже =delete при использовании C++11
};
 
class NonAssignable{
private: NonAssignable& operator = (const NonAssignable&);
};
 
class MyVeryUniqueObject: public NonCopyable, NonAssignable { // Мы явным образом указали свойства класса. Вместо того, чтобы прятать принадлежащие ему конструктор копирования и оператор присваивания, теперь можем их просто не упоминать.
public:
    // Интерфейс класса
private:
    // Данные класса
};
Через микс-ины можно также делать интрузивные контейнеры и другие полезные вещи.
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
29.07.2014, 19:29  [ТС]     Множественное наследование - так ли это плохо? #3
Извините, забыл упомянуть такой случай. Также не считаются абстрактные классы в качестве родителей - этим мы (как бы) моделируем Java-интерфейсы. То есть работает ли наследование от двух вполне конкретных классов типа примера Страуструпа:
C++
1
2
3
4
5
6
7
8
class displayed;// можно отобразить на экране
class task; // можно запустить в отдельный поток
 
// можно нарисовать в отдельном потоке
class displayed_task: public displayed, public task
{
// implementation
};
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,340
Записей в блоге: 11
30.07.2014, 09:19     Множественное наследование - так ли это плохо? #4
Цитата Сообщение от CyberSolver Посмотреть сообщение
Также не считаются абстрактные классы в качестве родителей - этим мы (как бы) моделируем Java-интерфейсы.
Концепция интерфейсов существует независимо от Java.
Интерфейсы это чисто архитектурное решение.

Цитата Сообщение от CyberSolver Посмотреть сообщение
С момента изучения Си++ во всех книжках все авторы (кроме самого Страуструпа) пишут, что множественное наследование - бяка и фу.
Кто пишет?
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 17:55  [ТС]     Множественное наследование - так ли это плохо? #5
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Концепция интерфейсов существует независимо от Java.
You don't say. Я же написал - "как бы".
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Кто пишет?
"Кто говорит? Все говорят!"

По делу что-то можете сказать?
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,340
Записей в блоге: 11
30.07.2014, 19:40     Множественное наследование - так ли это плохо? #6
Цитата Сообщение от CyberSolver Посмотреть сообщение
"Кто говорит? Все говорят!"
Поменьше читай того, что на заборе написано.

Запрет на множественное наследование пошел от некомпетентных людей. Ошибки множественного наследования обычно сводятся к архитектурным ошибкам.
Фаулер в одной из своих книг признал, что с появлением Java появилось множество плохо спроектированного ПО.
И что-бы эти люди лишний раз не отстреливали себе ноги при проектировании, была предложена концепция без множественного наследования.

Этот вопрос из той же оперы, что и: goto это плохо.
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 20:11  [ТС]     Множественное наследование - так ли это плохо? #7
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Поменьше читай того, что на заборе написано.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Запрет на множественное наследование пошел от некомпетентных людей.
Хм. Ну ладно. Я просто оставлю это здесь.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Ошибки множественного наследования обычно сводятся к архитектурным ошибкам.
Это настолько же верно, насколько и бесполезно.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Этот вопрос из той же оперы, что и: goto это плохо.
Да хорошо это, хорошо.

Собственно, ради этого я и задавал вопрос: мне кто-то покажет реальный код, где множественное наследование - это хорошо? Или все будут строить из себя умных, и рассуждать о жизни, Вселенной и обо всём таком?
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,340
Записей в блоге: 11
31.07.2014, 09:43     Множественное наследование - так ли это плохо? #8
Цитата Сообщение от CyberSolver Посмотреть сообщение
мне кто-то покажет реальный код, где множественное наследование - это хорошо?
Чем не устраивает пример Nick Alte?

При использовании библиотеки Qt можно много примеров привести, но не уверен, что вы знаете про сигналы/слоты
MrGluck
Ворчун
Эксперт CЭксперт С++
6455 / 3653 / 459
Регистрация: 29.11.2010
Сообщений: 9,650
31.07.2014, 16:16     Множественное наследование - так ли это плохо? #9
Хороший пример есть в книге Скотта Майерса, "Эффективное использование c++. 50 рекомендаций по улучшению ваших программ и проектов", правило 43, "Продумывайте подход к использованию множественного наследования". Честно говоря, на работе не использовал, но при надобности не воздержусь.
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
31.07.2014, 20:36  [ТС]     Множественное наследование - так ли это плохо? #10
Dmitriy_M, с чего вы взяли, что я не знаю Qt?

Добавлено через 6 минут
MrGluck, спасибо, сразу не вспомнил. Не сказал бы, что это хорошее решение и хороший код. Меня учили так: предпочитай композицию наследованию. А если одно на другое не заменяется - жди беды.
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,340
Записей в блоге: 11
01.08.2014, 08:57     Множественное наследование - так ли это плохо? #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
CyberSolver, Тогда обычный пример QGraphicsObject наследуется от QObject и QGraphicsItem.
Объекты этого класса могут быть отображены на сцене(наследует поведение от QGraphicsItem) и общаться посредством сигналов/слотов(наследует поведение от QObject)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2014, 09:33     Множественное наследование - так ли это плохо?
Еще ссылки по теме:

Наследование, так ли это C++
Множественное наследование C++
Множественное наследование C++
C++ Множественное наследование
C++ Множественное наследование

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
01.08.2014, 09:33  [ТС]     Множественное наследование - так ли это плохо? #12
Dmitriy_M, спасибо, как-то подзабыл Qt-ную иерархию. И вроде да - любое другое решение только добавляет проблем.
Yandex
Объявления
01.08.2014, 09:33     Множественное наследование - так ли это плохо?
Ответ Создать тему
Опции темы

Текущее время: 00:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru