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

C++

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

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

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

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

Вопрос: может ли кто-то привести пример (желательно из личной практики), где применение множественного наследования было бы самым удачным с точки зрения дизайна и/или производительности решением? Или всё-таки всегда-всегда можно заменить наследование композицией (ну или каким-нибудь паттерном twin)?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2014, 07:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Множественное наследование - так ли это плохо? (C++):

Множественное наследование - C++
Добрый день, коллективный разум, прошу твоей помощи. Вопрос в следующем: как имея следующую структуру классов использующих множественное...

Множественное наследование от Form - C++ Builder
class A { }; class B { }; class C : public Form,public A,public B {

Множественное виртуальное наследование от класса TForm - C++ Builder
У меня есть некий базовый класс TWindowBase (производный от TForm), который я наследую во все классы окон. Класс TWindowBase содержит кучу...

Множественное наследование VCL& экспорт TThread - C++ Builder
Здравствуйте. 1) Кто-нибудь пробовал экспортировать переменные типа TThread? extern TNewThread *NewThread; вызывает...

Множественное наследование - Visual C++
Создать иерархии наследования: телевизор, цифровое устройство - монитор. Создать динамический массив объектов, инициализировать его. Сам...

Множественное наследование POSTAVKA - Visual C++
Разработайте базовый класс POSTAVKA. Элемент класса: -название фирмы-поставщика; -цена поставщика. Методы: -метод,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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:
    // Данные класса
};
Через микс-ины можно также делать интрузивные контейнеры и другие полезные вещи.
2
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
};
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
30.07.2014, 09:19 #4
Цитата Сообщение от CyberSolver Посмотреть сообщение
Также не считаются абстрактные классы в качестве родителей - этим мы (как бы) моделируем Java-интерфейсы.
Концепция интерфейсов существует независимо от Java.
Интерфейсы это чисто архитектурное решение.

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

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

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

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

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

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

Добавлено через 6 минут
MrGluck, спасибо, сразу не вспомнил. Не сказал бы, что это хорошее решение и хороший код. Меня учили так: предпочитай композицию наследованию. А если одно на другое не заменяется - жди беды.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
01.08.2014, 08:57 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
CyberSolver, Тогда обычный пример QGraphicsObject наследуется от QObject и QGraphicsItem.
Объекты этого класса могут быть отображены на сцене(наследует поведение от QGraphicsItem) и общаться посредством сигналов/слотов(наследует поведение от QObject)
1
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
01.08.2014, 09:33  [ТС] #12
Dmitriy_M, спасибо, как-то подзабыл Qt-ную иерархию. И вроде да - любое другое решение только добавляет проблем.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2014, 09:33
Привет! Вот еще темы с ответами:

Наследование, так ли это - C++
Вообщем вот какой вопрос. 1). Первый вариант. struct T { private: int f; int g; };

Множественное наследование - C++
Доброго времени суток. Есть ряд операций. Логически операции делятся на группы ( к примеру, запрос, ответ, чтение из буфера и .п.). В...

Множественное наследование - C++
Друзья прошу помочь разобраться, как получить доступ из массива J, к методу (O) из класса (С) #include <iostream> using...

множественное наследование - C++
разработайте алгоритм и создайте программы с применением множественного наследования. При выполнении данного задания необходимо создать не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2014, 09:33
Ответ Создать тему
Опции темы

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