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

В чем смысл полиморфизма - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ При считывании из файла последний элемент читается дважды http://www.cyberforum.ru/cpp-beginners/thread1501631.html
Всем доброго времени суток! Нашёл граблю. Считываю из файла слова, разделённые пробелами, в vector<string>. Для куска кода, которые по моему разумению должны работать одинаково, выдают разный ответ. Кусок 1: string temp; vector<string> a; while (infile >> temp) a.push_back(temp);
C++ Зачем нужны дружественные функции Здравствуйте! Начал изучать "друзей" в С++, но в моём странном учебнике данная тема описывается буквально в 2-х абзацах. В одном абзаце даётся определение дружественных классов, в другом - дружественных функций. Далее без всяких примеров использования "друзей" начинается новая тема. Решил я почитать статьи в интернете по этой теме, начал с дружественных функций. Перечитав множество статей, я... http://www.cyberforum.ru/cpp-beginners/thread1501629.html
Разобрать программу перевода в различные системы счисления C++
Здравствуйте.Вопрос такой:Есть задача написать программу для перевода из 16сс(системы счисления) в 10сс+есть решение. //Вопрос:x обозначает степень,и изначально он равен 0.При вводе в программу числа F5 выдает правильный результат.Почему?ведь любое число в нулевой степени=1.получается должно быть так (70-55)*(16^0)+(5*15^1)=95,то есть ответ неверный. #include <math.h> #include <iostream>...
Считывание double чисел из txt в массив C++
Надо считать числа в массив double. Не использовать <iostream> и <fstream> и <iomanip>. Не работают, пробовала, все примеры которые находила используют их. Пробовала - Segm. fault и считывает только первое число и только его целую часть. for (int i = 0; i < 35*17; i++) { fscanf(e,"%lf\n",&val); printf("%.4f\n",val);
C++ Как ковертировать из ASCII опять в string? http://www.cyberforum.ru/cpp-beginners/thread1501581.html
Всем доброго здравия. Нашел программу, которая переводит буквы строки в порядковые номера по таблице ASCII, с помощью функции length(). Подскажите пожалуйста существует ли функция, которая бы перевела обратно порядковые номера в строку. P.S. Прошу быть толерантным к моей тупости.
C++ При первом запуске нового проекта HelloWorld в IDE CLion возникает ошибка Добрый день! Установил IDE CLion. Установил компилятор. Первая загрузка с проектом HelloWorld. Выдает вот такое сообщение. Кто-нибудь может подсказать в чем проблема. подробнее

Показать сообщение отдельно
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
20.07.2015, 09:53     В чем смысл полиморфизма
Цитата Сообщение от Andrey040601 Посмотреть сообщение
Объясните, пожалуйста, смысл полиморфизма. Не могу никак вникнуть. Где и как он используется? И примерчик, пожалуйста
есть собака, и кошка.
и то, и другое - животные.
собака лает. кошка мяукает.

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
IAnimal
{
    // не забываем про виртуальный диструктор
    virtual ~IAnimal(){}
 
    // все животные умеют издавать звуки
    virtual void sound() = 0;
};
 
struct Dog: IAnimal
{
    virtual void sound() { cout <<"гаф-гаф\n"; }
}
 
struct Cat: IAnimal
{
    virtual void sound() { cout <<"мяу-мяу\n"; }
}
 
// функция не знает с каким именно животным она работает
void sound(IAnimal& animal)
{
 
    // но это не мешает ей воспроизвести звучание любого животного
    // которого ей прислали
 
   // гафкай, или мяукай, в зависимости от того, кто ты там
   animal.sound();
}
рассмотрим класс IAnimal
такие классы любят называть "интерфейсы".
он задает методы управления всеми возможными животными.
в данном случае он сообщает: каким бы ни было животное,
но у него обязательно будет метод sound,
который заставит животное издавать звуки.

и есть кучка наследников: кошки, собаки.
это - разные классы.
у них разное поведение.
в данном случае они по разному звучат.

однако несмотря на их различия,
что бы они начали звучать в обоих случаях используется один и тот же метод.

поэтому, даже не зная точно, кто это:
кошка, или собака, мы можем заставить их звучать.

то есть мы можем выполнять действия над объектами не зная точно,
что именно это за объекты.
главное что бы у них у всех был одинаковый интерфейс.



зачем это нужно?

вот другой пример:

допустим, мы решили создать игрушку.
в игрушке будут бегать разные юниты,
и стрелять друг в друга из разных видов вооружения.

поскольку над проектом будет работать несколько программистов,
то нужно так распределить наши роли,
что бы мы друг другу не мешались.

допустим, вы будете писать код юнитов.
а я - код вооружения.

но как вы сможете писать код юнита, если вооружения ещё никакого нет?
как вы научите своих солдатиков стрелять из оружения, если код оружия ещё не написан?

и вот, мы с вами договариваемя: у любого вида оружия есть интерфейс IWeapon,
у которого есть метод Fire.

что бы юнит сделал выстрел, он должен вызвать этот метод для объект "оружия".
и уже не важно что это за оружие, но если у него есть такой метод,
ваш юнит сможет сделать выстрел.


таким образом, благодаря полиморфизму,
становится возможным солдатикам стрелять из любого вида оружия
(в том числе из такого, чей код ещё даже не написан).

и становится возможным налету (в момент выполнения программы) заменить одно оружие на другое.

солдатик достает пистолет и делает: "пиф-паф!"
а потом достает базуку и делает: "бууумс!"

при этом солдатик не знает как на самом деле устроен объект,
из которого он стреляет.

ему просто пофигу,
он сможет стрелять из любого оружия,
лишь бы у него был спуской крючок: IWeapon::Fire

это делает возможным:
1. командную разработку программного обеспечения, так, что бы никто никому не мешался.
и никого не ждал.

2. гибкость
(можно налету подменять поведение, за счет подмены объектов)

3. расширяемость
(что бы добавить ещё одну пушку - достаточно просто унаследоваться от интерфейса,
и реализовать определенные методы,
и все солдатики априори уже смогут пользоваться новым оружием без изменений в своем коде.).
 
Текущее время: 11:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru