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

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

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

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

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

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

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

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

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

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

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

Есть ли такая возможность в АСП? - C# ASP.NET
Здравствуйте. Использую Visual Studio 2010. Создал веб-проект с главной страницей для веб-приложений (Site.Master). Хочу привязать к...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CyBOSSeR
Эксперт C++
2300 / 1670 / 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
Эксперт С++
4934 / 2514 / 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
1236 / 774 / 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
Эксперт С++
4934 / 2514 / 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
1236 / 774 / 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
Эксперт С++
4934 / 2514 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2010, 15:40
Привет! Вот еще темы с ответами:

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

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

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

C# разве не мультиплатформный? - C#
Я всегда считал, что .НЕТ в нашем веке есть в каждой системе по началу, не в счет ХП. Дошла информация, что на маке ее нету, аля...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.07.2010, 15:40
Ответ Создать тему
Опции темы

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