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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
#1

а разве наследование такая уж важная возможность? - C++

11.07.2010, 14:17. Просмотров 1692. Ответов 35
Метки нет (Все метки)

а разве наследование такая уж важная возможность?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2010, 14:17     а разве наследование такая уж важная возможность?
Посмотрите здесь:

Существует ли в C++ такая возможность() - C++
Можно ли в с++ сделать так: любой написанный отрывок кода вырезать, вставить в отдельный файл( например .h) обозначить названием. ...

Создание метода без класса и аргументов разве нельзя ? - C++
Всем доброго времени суток. А разве нельзя создать обычный метод под main без аргументов типа того Ошибка error C3861: LAB5_1_8:...

почему в массиве str хранятся значения str2, ведь в функции создается копия...разве нет? - C++
почему в массиве str хранятся значения str2, ведь в функции создается копия...разве нет?..) #include <iostream> using namespace std; ...

ту такая проблема - C++
S=13!∑_(i=1)^20▒e d в степени -0,25 На форуме есть редактор формул. Он свёрнут по умолчанию и находится над редактором сообщений.

есть ли такая функция??? - C++
есть ли функция которая тип String а лучше AnsiString переводит в char???

Верна ли такая конструкция? - C++
Здравствуйте, Помогите пожалуйста разобраться верно ли я передаю данные между функциями. Есть 2 функции. Функция 1...

Это опечатка такая в книжке? - C++
Читаю Б.Му, Липпман и прочие товарищи. Вот пример(как бэ ожидалось что ошибки будут в вариантах ответов) struct Base { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2010, 14:26     а разве наследование такая уж важная возможность? #2
nikkka, да. Ты считаешь иначе?
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 14:47  [ТС]     а разве наследование такая уж важная возможность? #3
CyBOSSeR, нет. просто непонятно почему.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 14:48     а разве наследование такая уж важная возможность? #4
Цитата Сообщение от nikkka Посмотреть сообщение
нет. просто непонятно почему.
писать кода меньше, поддерживать код проще. чего ж непонятного.
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 14:51  [ТС]     а разве наследование такая уж важная возможность? #5
fasked, ну, если понадобилось улучшить класс, оставлая старый, то наследование "полезно". но разве это нужно так часто что для этого создали специалный раздел?
вы не беситесь))) вопроссы тупые, знаю. но ведь я только начинющий, и с наследованием пока работал недастаточно.
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.07.2010, 15:27     а разве наследование такая уж важная возможность? #6

Не по теме:

Хочешь узнать что такое настоящая инкапсуляция,
динамическая компоновка, изменение поведения в реальном времени,
тогда почитай что такое COM.



Добавлено через 1 минуту

Не по теме:

мини реклама была



Добавлено через 10 минут
специалный раздел
Это возможность ООП технологии.
Ни кто не заставляет использовать ООП там где оно не уместно и не приносит выгоду.
Где то тема есть: "зачем нужно ООП" тебе туда точно.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.07.2010, 15:28     а разве наследование такая уж важная возможность? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nikkka Посмотреть сообщение
fasked, ну, если понадобилось улучшить класс, оставлая старый, то наследование "полезно". но разве это нужно так часто что для этого создали специалный раздел?
вы не беситесь))) вопроссы тупые, знаю. но ведь я только начинющий, и с наследованием пока работал недастаточно.
Добавь к наследованию полиморфизм и получишь больше пользы.
Самый простой пример.

Например, пишешь ты игру. В игре у тебя есть куча всяких разных объектов: объекты-монстры класса Monster, объекты-препятствия класса Wall, объект-игрок класса Gamer, объекты-фоновые картинки класса BackgroundPicture и так далее.

Что у них общего? Общее у них то, что они должны быть отрисованы на экране, а значит, у них должна быть функция-член (метод) Draw. Но у каждого класса функция разная (а иногда очень разная).

Как поступить? Создаём базовый класс Entity с чисто виртуальной (абстрактной) функцией Draw, а все вышеперечисленные классы наследуем от Entity и функцию Draw перегружаем (переопределяем).

Для чего? Все наши объекты хранятся в массиве в виде указателя. Но не простого указателя, а указателя на базовый класс (Entity *). Когда идёт отрисовка уровня, проходим по всем элементам этого массива и вызываем метод Draw, но так как реально там лежает не объекты класса Entity, а его наследники, то для каждого из них будет вызван подходящий Draw.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Entity
{
  virtual void Draw() = 0;
};
 
class Monster
{
  void Draw()
  {
    // тут код для отрисовки монстра
  }
};
 
class Wall
{
  void Draw()
  {
    // тут код для отрисовки препятствия
  }
};
 
class Gamer
{
  void Draw()
  {
    // тут код для отрисовки игрока
  }
};
 
class BackgroundPicture
{
  void Draw()
  {
    // тут код для отрисовки фоновой картинки
  }
};
 
// .......
 
// массив, в котором хранятся все объекты
Entity* array[];
 
// .......
 
// функция, рисующая уровень
void DrawLevel()
{
  for (int i = 0; i < arrayLenght; i++)
    array[i]->Draw(); // тут будет вызываться нужный Draw в зависимости от типа объекта
}
Если бы небыло наследования и полиморфизма, нам бы пришлось писать гораздо больше кода и он бы был гораздо более запутанным.
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:30  [ТС]     а разве наследование такая уж важная возможность? #8
Genius Ignat, http://ru.wikipedia.org/wiki/Component_Object_Model -это?

Добавлено через 1 минуту
NightmareZ, воистину полезный пост!... спасибо!...
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 15:35     а разве наследование такая уж важная возможность? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nikkka Посмотреть сообщение
ну, если понадобилось улучшить класс, оставлая старый
если ты имеешь в виду, что поверх одного плохого кода, есть возможность прилепить еще один, то это неверно. Нужно не улучшать, а заранее проектировать иерархически верные наследования.

сейчас попробую привести банальный пример, но близкий к практике программирования.
допустим нам надо реализовать библиотеку для работы с сокетами. Известно, что сокеты бывают разные, протоколы бывают разные и работать надо с ними по разному, но желательно, чтобы семантика и интерфейсы были одинаковы, чтобы не надо было пользователю класса перечитывать документацию по пять раз. Остановимся на таком различии, есть сокеты, которые имеют адреса, соответствующие протоколу IPv4, а есть работающие с протоколом IPv6. Есть сокеты UDP, TCP и т.д.
Если для каждого такого сокета писать отдельную реализацию, то выходит просто неимоверное количество дублируемого кода (большинство функций реализуются все равно одинаково). А тогда почему бы не написать сначала базовый абстрактный класс (для предоставления интерфейса дочерним классам). Потом дочерние классы UDPSocket и TCPSocket, от TCP сделать еще один HTTPSocket.
Понятное дело можно увлечься и тогда вся иерархия превратиться в труднопонимаемые куски кода, которые невозможно поддерживать. Дабы не быть голословным вот небольшой кусочек кода.

C++
1
2
3
4
5
6
7
8
9
10
11
class Socket
{
    void Create();
    void Close();
 
    void Attach();
    void Detach();
 
    virtual void Send();
    virtual void Receive();
};
допустим функции Create(), Close(), Attach(), Detach() реализуются для всех дочерних классов одинаково. Их переопределять не стоит.
C++
1
2
3
4
5
6
7
8
9
10
11
class SocketUDP : public Socket
{
    void Send();
    void Receive();
};
 
class SocketTCP : public Socket
{
    void Send();
    void Receive();
}
неправда ли так куда удобнее, чем воротить два полноценных раздельных класса
учитывая, что это самый небольшой примерчик, а настоящие реализации могут достигать сотен строк.
ну а теперь надо от SocketTCP наследовать SocketHTTP. А без возможности наследования пришлось бы еще дублировать код и класса базового сокета. Ужас же.
C++
1
2
3
4
5
6
7
class SocketHTTP : public SocketTCP
{
    void SetUrl();
    void GetUrl();
    void SetUri();
    void GetUri();
}
Попробуй теперь даже вот эти небольшие примерчики переписать в отдельности. А если в базовом классе нашлась небольшая ошибочка? или просто понадобилось улучшение? переписывать все классы?

Не по теме:

К тому же наследование это тупо интересно



Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
есть сокеты, которые имеют адреса, соответствующие протоколу IPv4, а есть работающие с протоколом IPv6.
Хотел написать еще про два класса IPv4Address и IPv6Address для полного счастья, вставить их членом класса и забыл
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.07.2010, 15:35     а разве наследование такая уж важная возможность? #10
Оно.
nikkka только сразу на эту технологию, лучше сразу
не бросаться, как ни как ООП там тоже есть,
и помимо ООП, много других моментов не легких в понимании для начинающего.
Книги про COM есть в разделе COM/OLE.
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:36  [ТС]     а разве наследование такая уж важная возможность? #11
fasked, спасибо!... очень подробно и доступно!...
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.07.2010, 15:37     а разве наследование такая уж важная возможность? #12
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Оно.
nikkka только сразу на эту технологию, лучше сразу
не бросаться, как ни как ООП там тоже есть,
и помимо ООП, много других моментов не легких в понимании для начинающего.
Книги про COM есть в разделе COM/OLE.
А я б не советовал трогать COM вообще. Говорят, пока ***** не трогаешь - оно не воняет.
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:39  [ТС]     а разве наследование такая уж важная возможность? #13
Genius Ignat, спасибо. короче, пока просто учить с++, и не лезть в СОМ, пока не "поспею"?

Добавлено через 1 минуту
NightmareZ, а почему *****????? чем СОМ плох???
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 15:40     а разве наследование такая уж важная возможность? #14
Да и еще. Можно конечно написать один класс, который будет заниматься всем-всем-всем, но я думаю ты и сам понимаешь, что так делать нельзя. Поддерживать невозможно, объект будет дико "неповоротливым", тоже самое, как например на унитазе прилепить вохможности микроволновки и посудомойки, да еще и выход в интернет есть! Вроде все рядом, а ...
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.07.2010, 15:40     а разве наследование такая уж важная возможность? #15
Цитата Сообщение от nikkka Посмотреть сообщение
NightmareZ, а почему *****????? чем СОМ плох???
Тем что он недо-.NET
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:42  [ТС]     а разве наследование такая уж важная возможность? #16
fasked,

Добавлено через 1 минуту
NightmareZ, не, ну .NET точно придётся учить...
а с СОМ посмотрим просто прочту что ни будь типа "краткого обзора", что бы быть в курсе.
Genius Ignat
11.07.2010, 15:43
  #17

Не по теме:

А я б не советовал трогать COM вообще. Говорят, пока ***** не трогаешь - оно не воняет.
Если бы ты знал как грамотно microsoft построила себе мультимедиа платформу Dshow,
возможно ты поменял свое мнение.

NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.07.2010, 15:44     а разве наследование такая уж важная возможность? #18
nikkka, а ещё я бы посоветовал вдумчиво почитать про паттерны проектирования. Например, вот тут: http://ooad.asf.ru/Patterns.aspx

Скорее всего тебе многое будет непонятно, но, думаю, подсознание некоторые моменты для себя отметит и в дальнейшем это тебе поможет правильно мыслить в рамках ООП.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 15:45     а разве наследование такая уж важная возможность? #19
Цитата Сообщение от NightmareZ Посмотреть сообщение
почитать про паттерны проектирования
есть хорошая книга с примерами на Си++
Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес - Приемы объектно-ориентированного проектирования. Паттерны проектирования
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2010, 15:52     а разве наследование такая уж важная возможность?
Еще ссылки по теме:

что означает такая запись c*=a%10 - C++
Здравствуйте, у меня вот такой вопрос, что означает такая запись c*=a%10

Вот такая интересная штука на C - C++
написать программу нахождения совершенных чисел в диапазоне от 1 до 1000000 (миллион). Как, пока мне не понятно, если кто знает...

что за тема такая to-do list? - C++
объясните плиз что это такое(ну смысл типо список дел?), точнее как этим грамотно пользоваться?

Из-за чего могла возникнуть такая ошибка? - C++
Через некоторое время работы моя программа падает с такой ошибкой: terminate called after throwing an instance of 'std::bad_alloc' ...

Как узнать вылетела ли такая ошибка? - C++
День всем добрый! У моей программы проблемс. Иногда случается, что пользователю требуются библиотеки из пакета Visual C++ Redist., в...


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

Или воспользуйтесь поиском по форуму:
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.07.2010, 15:52     а разве наследование такая уж важная возможность? #20
Цитата Сообщение от Genius Ignat Посмотреть сообщение

Не по теме:


Если бы ты знал как грамотно microsoft построила себе мультимедиа платформу Dshow,
возможно ты помял свое мнение.

Грамотно можно построить что угодно на чём угодно. Но гвозди всё-таки лучше забивать молотком, а не отверткой и уж тем более не палкой-копалкой.

P.S. Я, наверное, всё-таки погорячился, назвам COM - ******. Он был хорош для своего времени. Но оно, какбэ прошло. Мне так кажется.

Добавлено через 6 минут
Цитата Сообщение от fasked Посмотреть сообщение
есть хорошая книга с примерами на Си++
Скажем так, легендарная книга
О ней не слышал, наверное, только глухой. Правда, каюсь, не читал
Yandex
Объявления
11.07.2010, 15:52     а разве наследование такая уж важная возможность?
Ответ Создать тему
Опции темы

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