С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
1

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

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

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

Вопрос: может ли кто-то привести пример (желательно из личной практики), где применение множественного наследования было бы самым удачным с точки зрения дизайна и/или производительности решением? Или всё-таки всегда-всегда можно заменить наследование композицией (ну или каким-нибудь паттерном twin)?
0
Лучшие ответы (1)
IT_Exp
Эксперт
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
Блог
29.07.2014, 07:03
Ответы с готовыми решениями:

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

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

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

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

11
Эксперт С++
1675 / 1047 / 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
1443 / 1326 / 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
1443 / 1326 / 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
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
31.07.2014, 09:43 8
Цитата Сообщение от CyberSolver Посмотреть сообщение
мне кто-то покажет реальный код, где множественное наследование - это хорошо?
Чем не устраивает пример Nick Alte?

При использовании библиотеки Qt можно много примеров привести, но не уверен, что вы знаете про сигналы/слоты
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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
1443 / 1326 / 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
01.08.2014, 09:33
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
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
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru