Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
1

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

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

а разве наследование такая уж важная возможность?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2010, 14:17
Ответы с готовыми решениями:

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

Есть ли такая возможность в АСП?
Здравствуйте. Использую Visual Studio 2010. Создал веб-проект с главной страницей для...

Есть ли такая возможность в C++ Builder
Есть ли такая возможность в C++ Builder, чтобы подключить какой то плагин, и при печатании текста...

Есть ли в Виндовс такая возможность
Здравствуйте.В универе стали изучать Линукс,а именно оболочку shell и язык...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
35
Эксперт С++
2334 / 1707 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2010, 14:26 2
nikkka, да. Ты считаешь иначе?
1
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 14:47  [ТС] 3
CyBOSSeR, нет. просто непонятно почему.
0
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 14:48 4
Цитата Сообщение от nikkka Посмотреть сообщение
нет. просто непонятно почему.
писать кода меньше, поддерживать код проще. чего ж непонятного.
1
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 14:51  [ТС] 5
fasked, ну, если понадобилось улучшить класс, оставлая старый, то наследование "полезно". но разве это нужно так часто что для этого создали специалный раздел?
вы не беситесь))) вопроссы тупые, знаю. но ведь я только начинющий, и с наследованием пока работал недастаточно.
0
1258 / 796 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
11.07.2010, 15:27 6

Не по теме:

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



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

Не по теме:

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



Добавлено через 10 минут
специалный раздел
Это возможность ООП технологии.
Ни кто не заставляет использовать ООП там где оно не уместно и не приносит выгоду.
Где то тема есть: "зачем нужно ООП" тебе туда точно.
1
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
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 в зависимости от типа объекта
}
Если бы небыло наследования и полиморфизма, нам бы пришлось писать гораздо больше кода и он бы был гораздо более запутанным.
7
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:30  [ТС] 8
Genius Ignat, http://ru.wikipedia.org/wiki/C... ject_Model -это?

Добавлено через 1 минуту
NightmareZ, воистину полезный пост!... спасибо!...
0
Эксперт С++
5025 / 2604 / 241
Регистрация: 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();
}
Попробуй теперь даже вот эти небольшие примерчики переписать в отдельности. А если в базовом классе нашлась небольшая ошибочка? или просто понадобилось улучшение? переписывать все классы?

Не по теме:

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



Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
есть сокеты, которые имеют адреса, соответствующие протоколу IPv4, а есть работающие с протоколом IPv6.
Хотел написать еще про два класса IPv4Address и IPv6Address для полного счастья, вставить их членом класса и забыл
2
1258 / 796 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
11.07.2010, 15:35 10
Оно.
nikkka только сразу на эту технологию, лучше сразу
не бросаться, как ни как ООП там тоже есть,
и помимо ООП, много других моментов не легких в понимании для начинающего.
Книги про COM есть в разделе COM/OLE.
1
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:36  [ТС] 11
fasked, спасибо!... очень подробно и доступно!...
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
11.07.2010, 15:37 12
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Оно.
nikkka только сразу на эту технологию, лучше сразу
не бросаться, как ни как ООП там тоже есть,
и помимо ООП, много других моментов не легких в понимании для начинающего.
Книги про COM есть в разделе COM/OLE.
А я б не советовал трогать COM вообще. Говорят, пока ***** не трогаешь - оно не воняет.
1
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:39  [ТС] 13
Genius Ignat, спасибо. короче, пока просто учить с++, и не лезть в СОМ, пока не "поспею"?

Добавлено через 1 минуту
NightmareZ, а почему *****????? чем СОМ плох???
0
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 15:40 14
Да и еще. Можно конечно написать один класс, который будет заниматься всем-всем-всем, но я думаю ты и сам понимаешь, что так делать нельзя. Поддерживать невозможно, объект будет дико "неповоротливым", тоже самое, как например на унитазе прилепить вохможности микроволновки и посудомойки, да еще и выход в интернет есть! Вроде все рядом, а ...
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
11.07.2010, 15:40 15
Цитата Сообщение от nikkka Посмотреть сообщение
NightmareZ, а почему *****????? чем СОМ плох???
Тем что он недо-.NET
1
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
11.07.2010, 15:42  [ТС] 16
fasked,

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

Не по теме:

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

0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
11.07.2010, 15:44 18
nikkka, а ещё я бы посоветовал вдумчиво почитать про паттерны проектирования. Например, вот тут: http://ooad.asf.ru/Patterns.aspx

Скорее всего тебе многое будет непонятно, но, думаю, подсознание некоторые моменты для себя отметит и в дальнейшем это тебе поможет правильно мыслить в рамках ООП.
0
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 15:45 19
Цитата Сообщение от NightmareZ Посмотреть сообщение
почитать про паттерны проектирования
есть хорошая книга с примерами на Си++
Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес - Приемы объектно-ориентированного проектирования. Паттерны проектирования
1
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
11.07.2010, 15:52 20
Цитата Сообщение от Genius Ignat Посмотреть сообщение

Не по теме:


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

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

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

Добавлено через 6 минут
Цитата Сообщение от fasked Посмотреть сообщение
есть хорошая книга с примерами на Си++
Скажем так, легендарная книга
О ней не слышал, наверное, только глухой. Правда, каюсь, не читал
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2010, 15:52

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Есть ли такая возможность в postgresSQL - хранить в одном поле массив целых чисел и какой тип в таком случае используется?
Есть ли такая возможность в postgresSQL - хранить в одном поле массив целых чисел и какой тип в...

Наследование от Иоанна. Есть ли возможность как-то вызвать метод Gleb из класса а в классе с
Привет всем. Подскажите пожалуйста using System; class a { protected int x; protected...

Установил Windows XP с флешки такая вот такая ситуатция !
У меня такая вот проблема : Установил виндовс с флешки ! записывал на флешку винду хр с помощью...

Самая важная запчасть
Пришёл я пару лет назад в магазин покупать ноут. В этом не разбираюсь. Попросил совета у продавца....


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

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

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