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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
24.02.2013, 17:38     Так в каких случаях стоит использовать наследование? #1
Здравствуйте, уважаемое сообщество.

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

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

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

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

C++ <iostream> в каких случаях используется?
C++ В каких случаях возникает необходимость в создании своего деструктора?
C++ В каких случаях оправданно использование локальных классов?
C++ В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?
В каких случаях необходимо включать include string C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
25.02.2013, 19:02  [ТС]     Так в каких случаях стоит использовать наследование? #2
Неужели никто не поможет углубиться в понимание концепции ООП ?
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
25.02.2013, 19:50     Так в каких случаях стоит использовать наследование? #3
Цитата Сообщение от p0lym0rph Посмотреть сообщение
А высокая связность, как известно, не очень хорошо.
у любой монеты есть две стороны.


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


===========================================================
Каждый музыкант играет по своему, практикуйся больше и сам все поймешь
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2013, 20:20     Так в каких случаях стоит использовать наследование? #4
Когда производный класс является базовым классом. Скажем, треугольник является геометрической фигурой.
Когда это не так очевидно, то лучше использовать агреграцию.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
25.02.2013, 20:28     Так в каких случаях стоит использовать наследование? #5
Когда нужно показать отношение "является" - public наследование
Когда "реализован посредством" - private наследование
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
25.02.2013, 20:45  [ТС]     Так в каких случаях стоит использовать наследование? #6
Большое спасибо за ответы!

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

Добавлено через 5 минут
"реализован посредством" можно выразить и с помощью композиции/агрегации. Единственное применение private наследования, это когда у базового класса, посредством которого, мы реализуем новый класс, имеется интерфейс без реализации. Или я не прав?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.02.2013, 20:51     Так в каких случаях стоит использовать наследование? #7
p0lym0rph, protected/private наследование всегда можно заменить на композицию + делегирование. Вроде как...)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
25.02.2013, 21:03     Так в каких случаях стоит использовать наследование? #8
p0lym0rph, единственное применение private наследования это как раз указать, что класс "реализуется посредством". С помощью агрегации/вложения моделируют связь "содержит". Это даже не говорит о том, что между классами существует концептуальная взаимосвязь, это просто заинтересованность в повторном использовании кода. Это исключительно прием реализации а не проектирования связей.
Фактически, вложение тоже означает "реализуется посредством/содержит". Так вот, закрытое наследование надо использовать лишь в исключительных моментах, когда вы его просто обязаны применить, в остальных случаях предпочитайте агрегацию.
Пример: когда класс существует исключительно для того, чтобы быть унаследованным и до конца реализованным лишь у потомков, при этом обезопасив себя вы умышленно делаете все его методы закрытыми и используйте private наследование.
Но это тонкости языка.
А что означает protected? Лишь условность, удобство использования, конкретное определение связи оно не дает, нужно смотреть на рамки определенной задачи.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
25.02.2013, 21:52     Так в каких случаях стоит использовать наследование? #9
Цитата Сообщение от p0lym0rph Посмотреть сообщение
Единственное применение private наследования
Это не единственное.

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

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

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

Одна из самых интересных серий по C++, на мой взгляд. Перечитывал несколько раз - до сих пор что-то новое узнаю оттуда)
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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 защищает метод от воздействия извне, но любые потомки могут открыто его использовать.

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

Это то же самое, что два параллельных конвейера, по которым идут детали для сборки и детали от первого не будут попадать в детали второго
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 23:01     Так в каких случаях стоит использовать наследование?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
p0lym0rph
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
25.02.2013, 23:01  [ТС]     Так в каких случаях стоит использовать наследование? #12
И еще раз всем огромное спасибо за ответы!
Yandex
Объявления
25.02.2013, 23:01     Так в каких случаях стоит использовать наследование?
Ответ Создать тему
Опции темы

Текущее время: 16:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru