Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
1

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

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

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

Вопрос: может ли кто-то привести пример (желательно из личной практики), где применение множественного наследования было бы самым удачным с точки зрения дизайна и/или производительности решением? Или всё-таки всегда-всегда можно заменить наследование композицией (ну или каким-нибудь паттерном twin)?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2014, 07:03
Ответы с готовыми решениями:

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

Множественное наследование
перед тем, как перейти к вопросу, опишу ситауцию. Есть класс "фильтр", единственное что он...

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

Множественное наследование
Добрый день, есть такая задача Программа имеет определенный набор классов и методов. Сейчас решил...

11
Эксперт С++
1667 / 1039 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
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
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 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
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
30.07.2014, 09:19 4
Цитата Сообщение от CyberSolver Посмотреть сообщение
Также не считаются абстрактные классы в качестве родителей - этим мы (как бы) моделируем Java-интерфейсы.
Концепция интерфейсов существует независимо от Java.
Интерфейсы это чисто архитектурное решение.

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

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

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

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

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

При использовании библиотеки Qt можно много примеров привести, но не уверен, что вы знаете про сигналы/слоты
0
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
31.07.2014, 16:16 9
Хороший пример есть в книге Скотта Майерса, "Эффективное использование c++. 50 рекомендаций по улучшению ваших программ и проектов", правило 43, "Продумывайте подход к использованию множественного наследования". Честно говоря, на работе не использовал, но при надобности не воздержусь.
1
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
31.07.2014, 20:36  [ТС] 10
Dmitriy_M, с чего вы взяли, что я не знаю Qt?

Добавлено через 6 минут
MrGluck, спасибо, сразу не вспомнил. Не сказал бы, что это хорошее решение и хороший код. Меня учили так: предпочитай композицию наследованию. А если одно на другое не заменяется - жди беды.
0
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.08.2014, 08:57 11
Лучший ответ Сообщение было отмечено CyberSolver как решение

Решение

CyberSolver, Тогда обычный пример QGraphicsObject наследуется от QObject и QGraphicsItem.
Объекты этого класса могут быть отображены на сцене(наследует поведение от QGraphicsItem) и общаться посредством сигналов/слотов(наследует поведение от QObject)
1
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
01.08.2014, 09:33  [ТС] 12
Dmitriy_M, спасибо, как-то подзабыл Qt-ную иерархию. И вроде да - любое другое решение только добавляет проблем.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2014, 09:33

Множественное наследование
Здравствуйте! Делаю следующее задание по подготовке к экзамену по С++. Пока только начал....

Множественное наследование
#include "stdafx.h" #include <iostream> #include <string.h> #include <conio.h> using...

Множественное наследование
Листинг: #include <iostream> using namespace std; class Person{private: string...

Множественное наследование.
В C# оно запрещено. Но в тоже время если: class A Class B: A Class C: B Такое возможно и при...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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