С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
#1

Так в каких случаях стоит использовать наследование? - C++

24.02.2013, 17:38. Просмотров 1740. Ответов 11
Метки нет (Все метки)

Здравствуйте, уважаемое сообщество.

После прочтения "C++ Coding Standards" by Herb Sutter and Andrei Alexandrescu, возникли некоторые вопросы.
Наследование является второй по силе взаимосвязью между классами (первое - дружественные классы/функции).
А высокая связность, как известно, не очень хорошо.

Так вот, в каких случаях действительно никак не обойтись без наследования?
Для себя выделил 3 основных случая:
1. Необходим доступ к ptotected членам базового класса.
2. Для предоставления интерфейса.
3. Для предоставления деталей реализации.

И еще, в каких случаях необходимо закрытое (private) наследование? (Мне кажется, что в тех случаях, когда хотим закрыть доступ извне для использования этого класса по интерфейсу базового)

Заранее спасибо за ответы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 17:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Так в каких случаях стоит использовать наследование? (C++):

В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? - C++
В книге Г. Шилдта написано, что конструктор копирования может неявно вызываться, при инициализации объекта значением, которое возращает...

Что и в каких случаях лучше использовать: cerr, clog, cout ? - C++
Доброго времени суток! Подскажите пожалуйста, когда лучше использовать cerr, clog, cout? При буферизованном вводе/выводе данные сначала...

В каких случаях нужно создавать динамические переменные, а в каких статические? - C++
такой же вопрос и по массивам ! Объясните пожалуйста !

Объясните в каких случаях используеться char, а в каких string? - C++
Зачем(в каких случаях) использовать char, и char *... Зачем(в каких случаях) использовать string...

<iostream> в каких случаях используется? - C++
Что такое &lt;iostream&gt; расскажите о нем, для чего он используется.

Static обьект, в каких случаях применяется? - C++
Всем доброго дня ! Скажите пожалуйста в каком случае применяются статические обьекты.? class A { int x;

11
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
25.02.2013, 19:02  [ТС] #2
Неужели никто не поможет углубиться в понимание концепции ООП ?
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
25.02.2013, 19:50 #3
Цитата Сообщение от p0lym0rph Посмотреть сообщение
А высокая связность, как известно, не очень хорошо.
у любой монеты есть две стороны.


Цитата Сообщение от p0lym0rph Посмотреть сообщение
Необходим доступ к ptotected членам базового класса.
не наследование является следствием необходимости доступа к тому, что находится в protected, а protected является следствием наследования.


===========================================================
Каждый музыкант играет по своему, практикуйся больше и сам все поймешь
1
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2013, 20:20 #4
Когда производный класс является базовым классом. Скажем, треугольник является геометрической фигурой.
Когда это не так очевидно, то лучше использовать агреграцию.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
25.02.2013, 20:28 #5
Когда нужно показать отношение "является" - public наследование
Когда "реализован посредством" - private наследование
1
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
25.02.2013, 20:45  [ТС] #6
Большое спасибо за ответы!

Цитата Сообщение от MrGluck Посмотреть сообщение
Когда нужно показать отношение "является" - public наследование
Когда "реализован посредством" - private наследование
А какое подходящее отношение для protected наследования?

Добавлено через 5 минут
"реализован посредством" можно выразить и с помощью композиции/агрегации. Единственное применение private наследования, это когда у базового класса, посредством которого, мы реализуем новый класс, имеется интерфейс без реализации. Или я не прав?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.02.2013, 20:51 #7
p0lym0rph, protected/private наследование всегда можно заменить на композицию + делегирование. Вроде как...)
1
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
25.02.2013, 21:03 #8
p0lym0rph, единственное применение private наследования это как раз указать, что класс "реализуется посредством". С помощью агрегации/вложения моделируют связь "содержит". Это даже не говорит о том, что между классами существует концептуальная взаимосвязь, это просто заинтересованность в повторном использовании кода. Это исключительно прием реализации а не проектирования связей.
Фактически, вложение тоже означает "реализуется посредством/содержит". Так вот, закрытое наследование надо использовать лишь в исключительных моментах, когда вы его просто обязаны применить, в остальных случаях предпочитайте агрегацию.
Пример: когда класс существует исключительно для того, чтобы быть унаследованным и до конца реализованным лишь у потомков, при этом обезопасив себя вы умышленно делаете все его методы закрытыми и используйте private наследование.
Но это тонкости языка.
А что означает protected? Лишь условность, удобство использования, конкретное определение связи оно не дает, нужно смотреть на рамки определенной задачи.
1
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
25.02.2013, 21:52 #9
Цитата Сообщение от p0lym0rph Посмотреть сообщение
Единственное применение private наследования
Это не единственное.

Например так
Пусть
Базовый класс = дедушка
Потомок от дедушки = папа
Потомок от папы = внук.

Чтобы внук не навредил дедушке, можно использовать приват наследование. Внук не будет знать о существовании дедушки и поэтому навредить ему не сможет.

Если не планируется плодить потомство дальше внука и нужно защитить деда, то приват наследование само собой напрашивается
==================
1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
25.02.2013, 22:15 #10
Вопрос очень объемный и почти все приемы взаимозаменяемы, НО ни один из них не панацея. Трудно дать развернутый ответ на вопрос, читал Скотта Мейерса? У него есть отличные советы насчет применения интересующих тебя приемов с примерами и вообще, много интересного - почитай. Все вопросы отпадут - 100%

Одна из самых интересных серий по C++, на мой взгляд. Перечитывал несколько раз - до сих пор что-то новое узнаю оттуда)
1
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
25.02.2013, 22:52 #11
Попробую прояснить protected, если я не прав просьба поправить. Я думаю как сейчас опишу, но я могу заблуждаться.

Например над одной программой работает коллектив программистов. Планируется, что программа многофункциональна и поэтому одни разрабатывают что-то одно, что в конце должно собраться в одно целое, вторые разрабатывают что-то другое, что должно собраться в совершенно другое целое. Третьи третье и так далее. Все эти получившиеся целые надо собрать воедино. Вот тут есть момент, что то, что делали одни начнет приводить к конфликтам того, что делали другие. Такое возможно по многим причинам.

Чтобы избежать бооольших проблем из-за возможной не состыковки, имеет смысл применять protected наследование.(конечно можно и по другому, ведь С++ == как хочу, так верчу)

Чтобы было яснее, я приведу пример не наследования protected, а модификатора protected
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class A
{
protected:
    void prot() //Вот эта функция защищена модификатором protected
    {
        cout<<"prot\n"; //Если мы ее вызовем, то напишем сообщение
    }
};
 
class B:public A //Наследуем B из A 
{
public:
    void func() //Эта функция из класса B, но
    {
        prot(); //она наследует функцию из А и вызывает ее, словно был вызван метод из А
    }
};
 
int main()
{
    A objA; //Объект класса А
    B objB;//Объект класса B
 
    //objA.prot(); //Так нельзя, потому что в А метод защищен от воздействия
    
    objB.func(); //Но так можно. Это уже имитация метода из класса А
    cin.get();
    return 0;
}
Смысл в том, что protected защищает метод от воздействия извне, но любые потомки могут открыто его использовать.

Если смотреть чуть-чуть глобальнее, то можно понять ход моих мыслей. Сейчас я защищал метод класса, но что мешает защищать одну иерархию классов от другой иерархии если все эти иерархии в конце планируется объединить. (другими словами, что мешает огораживать создание первого целого из кусочков от создания второго целого из кусочков для одной конечной сборки).

Это то же самое, что два параллельных конвейера, по которым идут детали для сборки и детали от первого не будут попадать в детали второго
1
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
25.02.2013, 23:01  [ТС] #12
И еще раз всем огромное спасибо за ответы!
0
25.02.2013, 23:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 23:01
Привет! Вот еще темы с ответами:

В каких случаях требуется работа с памятью? - C++
Приветствую всех. Интересует такой вопрос. Я знаком с основами C++. Но я читал где-то, что если разрабатывается большой проект, то работы...

В каких случаях целесообразно динамическое выделение памяти? - C++
Здравствуйте, у меня назрел вот такой вот вопросик: Как я понимаю динамические переменные и массивы создаются с целью устранить утечки...

В каких случаях оправданно использование локальных классов? - C++
Здравствуйте. Вопрос: в каких случаях оправданно использование локальных классов? Или когда нужно использовать локальные классы? Какие есть...

В каких случаях необходимо включать include string - C++
В каких случаях необходимо использовать инструкцию препроцессора #include &lt;string&gt;? Раньше я думал, что это необходимо всякий раз, как я...


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

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

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