|
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
|
|
Так в каких случаях стоит использовать наследование?24.02.2013, 17:38. Показов 7087. Ответов 11
Метки нет (Все метки)
Здравствуйте, уважаемое сообщество.
После прочтения "C++ Coding Standards" by Herb Sutter and Andrei Alexandrescu, возникли некоторые вопросы. Наследование является второй по силе взаимосвязью между классами (первое - дружественные классы/функции). А высокая связность, как известно, не очень хорошо. Так вот, в каких случаях действительно никак не обойтись без наследования? Для себя выделил 3 основных случая: 1. Необходим доступ к ptotected членам базового класса. 2. Для предоставления интерфейса. 3. Для предоставления деталей реализации. И еще, в каких случаях необходимо закрытое (private) наследование? (Мне кажется, что в тех случаях, когда хотим закрыть доступ извне для использования этого класса по интерфейсу базового) Заранее спасибо за ответы.
0
|
|
| 24.02.2013, 17:38 | |
|
Ответы с готовыми решениями:
11
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?
В каких случаях использовать обращение self::, а в каких $this. В чём разница между ними? |
|
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
|
|
| 25.02.2013, 19:02 [ТС] | |
|
Неужели никто не поможет углубиться в понимание концепции ООП ?
0
|
|
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|||
| 25.02.2013, 19:50 | |||
|
======================================== =================== Каждый музыкант играет по своему, практикуйся больше и сам все поймешь
1
|
|||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 25.02.2013, 20:28 | |
|
Когда нужно показать отношение "является" - public наследование
Когда "реализован посредством" - private наследование
1
|
|
|
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
|
||
| 25.02.2013, 20:45 [ТС] | ||
|
Большое спасибо за ответы!
![]() Добавлено через 5 минут "реализован посредством" можно выразить и с помощью композиции/агрегации. Единственное применение private наследования, это когда у базового класса, посредством которого, мы реализуем новый класс, имеется интерфейс без реализации. Или я не прав?
0
|
||
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
| 25.02.2013, 20:51 | |
|
p0lym0rph, protected/private наследование всегда можно заменить на композицию + делегирование. Вроде как...)
1
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 25.02.2013, 21:03 | |
|
p0lym0rph, единственное применение private наследования это как раз указать, что класс "реализуется посредством". С помощью агрегации/вложения моделируют связь "содержит". Это даже не говорит о том, что между классами существует концептуальная взаимосвязь, это просто заинтересованность в повторном использовании кода. Это исключительно прием реализации а не проектирования связей.
Фактически, вложение тоже означает "реализуется посредством/содержит". Так вот, закрытое наследование надо использовать лишь в исключительных моментах, когда вы его просто обязаны применить, в остальных случаях предпочитайте агрегацию. Пример: когда класс существует исключительно для того, чтобы быть унаследованным и до конца реализованным лишь у потомков, при этом обезопасив себя вы умышленно делаете все его методы закрытыми и используйте private наследование. Но это тонкости языка. А что означает protected? Лишь условность, удобство использования, конкретное определение связи оно не дает, нужно смотреть на рамки определенной задачи.
1
|
|
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||
| 25.02.2013, 21:52 | ||
|
Например так Пусть Базовый класс = дедушка Потомок от дедушки = папа Потомок от папы = внук. Чтобы внук не навредил дедушке, можно использовать приват наследование. Внук не будет знать о существовании дедушки и поэтому навредить ему не сможет. Если не планируется плодить потомство дальше внука и нужно защитить деда, то приват наследование само собой напрашивается ==================
1
|
||
|
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
|
|
| 25.02.2013, 22:15 | |
|
Вопрос очень объемный и почти все приемы взаимозаменяемы, НО ни один из них не панацея. Трудно дать развернутый ответ на вопрос, читал Скотта Мейерса? У него есть отличные советы насчет применения интересующих тебя приемов с примерами и вообще, много интересного - почитай. Все вопросы отпадут - 100%
![]() Одна из самых интересных серий по C++, на мой взгляд. Перечитывал несколько раз - до сих пор что-то новое узнаю оттуда)
1
|
|
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||||||
| 25.02.2013, 22:52 | ||||||
|
Попробую прояснить protected, если я не прав просьба поправить. Я думаю как сейчас опишу, но я могу заблуждаться.
Например над одной программой работает коллектив программистов. Планируется, что программа многофункциональна и поэтому одни разрабатывают что-то одно, что в конце должно собраться в одно целое, вторые разрабатывают что-то другое, что должно собраться в совершенно другое целое. Третьи третье и так далее. Все эти получившиеся целые надо собрать воедино. Вот тут есть момент, что то, что делали одни начнет приводить к конфликтам того, что делали другие. Такое возможно по многим причинам. Чтобы избежать бооольших проблем из-за возможной не состыковки, имеет смысл применять protected наследование.(конечно можно и по другому, ведь С++ == как хочу, так верчу) Чтобы было яснее, я приведу пример не наследования protected, а модификатора protected
Если смотреть чуть-чуть глобальнее, то можно понять ход моих мыслей. Сейчас я защищал метод класса, но что мешает защищать одну иерархию классов от другой иерархии если все эти иерархии в конце планируется объединить. (другими словами, что мешает огораживать создание первого целого из кусочков от создания второго целого из кусочков для одной конечной сборки). Это то же самое, что два параллельных конвейера, по которым идут детали для сборки и детали от первого не будут попадать в детали второго
1
|
||||||
|
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
|
|
| 25.02.2013, 23:01 [ТС] | |
|
И еще раз всем огромное спасибо за ответы!
0
|
|
| 25.02.2013, 23:01 | |
|
Помогаю со студенческими работами здесь
12
В каких случаях необходимо использовать equals, а в каких == В каких случаях стоит инкапсулировать данные в объект? В каких случаях стоит применять метод File.AppendText()?
В каких случаях предпочтительней использовать процедуры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|