Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878

Зачем нужен полиморфизм

09.02.2016, 13:39. Показов 2820. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
читал про то что такое полиморфизм, виртуальные методы и тд, вот промер из статьи про виртуальный диструктор

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class base
{
    public:
     virtual ~base()
    {
      cout << "Вызван деструктор базового класса base\n";
    }
  };
 
class derived: public base
{
  public:
   ~derived()
  {
    cout << "Вызван деструктор производного класса derived\n";
  }
};
C++
1
2
3
4
5
 base *p; // объявляем указатель на базовый класс base
  derived d_ob;
  p=new derived(); // присваиваем указателю адрес объекта производного объекта derived
  delete p; // удаляем объект, на который ссылается указатель
  return 0;
примеры везде на один мотив.

Теперь главный вопрос который не дает мне покоя, а с какого это перепоя мне вдруг понадобится указателю с одним типом, присваивать данные друго-го типа???!!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2016, 13:39
Ответы с готовыми решениями:

Объяснить зачем нужен i
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { cout &lt;&lt; &quot;Enter chislo and stepen: &quot;; ...

зачем нужен параметр
#include&quot;otobrazenie.h&quot; #include &quot;primary.h&quot; #include &lt;iostream&gt; #include &quot;execution.h&quot; #include&quot;output.h&quot; #include&quot;input.h&quot; ...

Зачем нужен inline
Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта функция повысит эффективность, но так и...

17
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
09.02.2016, 13:53
Ну, например, у вас есть абстрактный класс Фигура и несколько конкретных ее наследников - различных фигур. Пусть вы хотите написать функцию, выводящую на экран объект любой из этих фигур. Какой параметр должен быть у функции? Правильно, указатель или ссылка на базовый класс Фигура.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
09.02.2016, 15:49  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, например, у вас есть абстрактный класс Фигура и несколько конкретных ее наследников - различных фигур. Пусть вы хотите написать функцию, выводящую на экран объект любой из этих фигур. Какой параметр должен быть у функции? Правильно, указатель или ссылка на базовый класс Фигура.
а можно пример, я ничнго не понял..
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.02.2016, 15:59
mh-coder,


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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
 
//////////////////////////////////////////////////////////////////////
struct Point2D
{
    int _x;
    int _y;
};
//////////////////////////////////////////////////////////////////////
class Unit
{
public:
    virtual void runTo(const Point2D& point) = 0;
};
//////////////////////////////////////////////////////////////////////
class Zombie : public Unit
{
private:
    void runTo( const Point2D& point ) override
    {
        cout << "Zombie run " << endl;
    }
};
//////////////////////////////////////////////////////////////////////
class Spider : public Unit
{
private:
    void runTo( const Point2D& point ) override
    {
        cout << "Spider run " << endl;
    }
};
//////////////////////////////////////////////////////////////////////
class SpiderBoss : public Spider
{
private:
    void runTo( const Point2D& point ) override
    {
        cout << "SpiderBoss run " << endl;
    }
};
//////////////////////////////////////////////////////////////////////
class Game
{
private:
    std::vector<Unit*> m_units;
 
public:
    Game()
    {
        m_units.push_back(new Zombie());
        m_units.push_back(new Spider());
        m_units.push_back(new SpiderBoss());
        m_units.push_back(new Zombie());
    }
 
    void start()
    {
        for(auto& it : m_units)
        {
            Unit* pointerToCurrentUnit = it;                  // общее поведение для всех типов, разная реализация у каждого типа
            pointerToCurrentUnit->runTo( {2,2} );
        }            
    }
};
//////////////////////////////////////////////////////////////////////
int main()
{   
    Game a;
    a.start();
}
1
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
09.02.2016, 16:00
Цитата Сообщение от mh-coder Посмотреть сообщение
а можно пример, я ничнго не понял..
думаешь ты поймешь пример?

Это нормально что-то не понимать, понимание приходит с практикой, так что советую не терять времени....
1
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
09.02.2016, 17:31  [ТС]
rikimaru2013, спасибо за пример, интересная реализация, я б никогда не додумался так использовать классы

Цитата Сообщение от _Valera_ Посмотреть сообщение
Это нормально что-то не понимать, понимание приходит с практикой, так что советую не терять времени....
не спорю, но есть одно но, я уже 2.5 года кодю на с++ при этом не считая года обчения, тоесть практики было достаточно, но я никогда не использовал модификатор virtual так как не понимал его смысла, чесно говоря мне и наследование никогда не приходилось использовать... хотя и проэкты я писал не маленькие... вообще не пониаю в каких случаях его(наследование) нужно использовать...
когда я пишу порграмму у меня есть основной класс с методами самой программы и дополнительные классы( типы )(для роботы с файлами, реестром и тп) которые наследовать основному классу нет смысла.
где подобному практиковатся?...
сейчас хочу устроится работать на фирму, наверника мне всё это понадобится, вот и решил уточнить зачем оно всё надо...
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.02.2016, 17:38
mh-coder, создайте новую тему на форуме с этой вашей цитатой:

не спорю, но есть одно но, я уже 2.5 года кодю на с++ при этом не считая года обчения, тоесть практики было достаточно, но я никогда не использовал модификатор virtual так как не понимал его смысла, чесно говоря мне и наследование никогда не приходилось использовать... хотя и проэкты я писал не маленькие... вообще не пониаю в каких случаях его(наследование) нужно использовать...
когда я пишу порграмму у меня есть основной класс с методами самой программы и дополнительные классы( типы )(для роботы с файлами, реестром и тп) которые наследовать основному классу нет смысла.
где подобному практиковатся?...
сейчас хочу устроится работать на фирму, наверника мне всё это понадобится, вот и решил уточнить зачем оно всё надо...
вы много нового узнаете: кто вы и что вам делать
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.02.2016, 17:41
Цитата Сообщение от mh-coder Посмотреть сообщение
в каких случаях его(наследование) нужно использовать
Ну, например, когда у вас производные методы не должны меняться, то вместо того, чтобы их писать по 100 раз мы просто их наследуем. Пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Unit
{
    public:
        virtual void Say(std::string str) { std::cout << str << std::endl; }
}
class Zombie : public Unit 
{
    public:
        Zombie();
}
int main()
{
    Zombie zomb;
    zomb.Say("argh");
}
1
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
09.02.2016, 17:44
Цитата Сообщение от mh-coder Посмотреть сообщение
Теперь главный вопрос который не дает мне покоя, а с какого это перепоя мне вдруг понадобится указателю с одним типом, присваивать данные друго-го типа???!!!!
Этот вопрос вообще не имеет никакого отношения к полиморфизму. Как и полиморфизм к ООП. Полиморфизм суть абстракция для собздания обобщенных функций/методов. Обобщенных, означает то что она/он существует в единственном экземпляре в исходном тексте программы, но применяется к любым типам, для которых определены операции, описанные в теле полиморфной функции/метода.
Кликните здесь для просмотра всего текста
Подозреваю, но не знаю чтояно что Ъполиморфизм это единственный инстанс и после копиляции.
Полиморфизм (точнее псевдополиморфизм) в c++ реализован частично ядром языка, частично языком шаблонов.
1
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
09.02.2016, 18:26  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы много нового узнаете: кто вы и что вам делать
ну может вы тут мне разскажите кто я и что мне делать)) зачем плодить темы с подобными глупыми вопросами)
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.02.2016, 18:36
mh-coder, вам рано еще на работу ити. Подумайте, что вы можете дать работодателю - сейчас мало кто заинтересован учить с нуля.

С++ один из самых сложных, зарплаты ( у меня в городе к примеру) в раз превышает среднюю зарплату. Так получается работа сложная? Откройте GitHub выберите С++ и посмотрите проекты - везде записывают в базовый класс производные. Возможно вы не тем занимались эти 2.5 года?

Расскажите какие проекты вы писали, что не было необходимости в наследовании. Давайте обсуждать.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
09.02.2016, 18:54  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Расскажите какие проекты вы писали, что не было необходимости в наследовании. Давайте обсуждать.
ну вот к примеру один из моих проэктов
http://djoser-blog.ru/soft/сканер-плагинов-wp/

вот эго исходник
Вложения
Тип файла: zip WPPS.zip (18.5 Кб, 12 просмотров)
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
09.02.2016, 19:00  [ТС]
(тут есть наследование, но оно тут использовано скороее от безисходности чем из необходимости)...еслиб я писал свои классы для отрисовки контроллов, то я бы сделал класс(тип) рисовал всё вызывая его методы... как по мне это удобнее чем от него наследоватся...
0
09.02.2016, 20:11

Не по теме:

mh-coder, я не уверен, что пользователи с пониманием отнесутся к программе в названии которой есть такая галимая орфографическая ошибка - plAgin

0
09.02.2016, 20:18

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
я не уверен, что пользователи с пониманием отнесутся к программе в названии которой есть такая галимая орфографическая ошибка - plAgin
я как раз с пониманием отнесся, мне про этот проект все понятно :D

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.02.2016, 21:16
mh-coder, представьте что Вы описываете поведение группы родственных сущностей. Например, в комнате может быть или кот или пёс или ребёнок. Вы, через дверь задаёте вопрос "Who's there?" и поскольку Горацио там нет, то в ответ Вы услышите "Гав!" или "Мяу!" или... поймёте что кто-то укакался.
Если Вы напишете класс Somebody, то придется прибегнуть к самоидентификации. Например, написать перечисление {cat, dog, babby} и поле данного перечисления хранящее значение. Метод thisIsMe, в зависимости от значения данного поля, будет реализовывать поведение и это может быть сделано тремя if'ами, switch'ем или, например, массивом из трёх указателей на методы.
Но если Вы напишете SomeBody с виртуальным методом thisIsMe, то унаследовав от этого класса, классами Cat, Dog, Babby и реализовав в них данный метод, Вы получите правильное поведение, вызвав thisIsMe через указатель или ссылку на SomeBody, которая указывает на объект любого из дочерних классов.
То есть, пока оно гавкаят, мяукает или... грозно молчит, Вы можете изрекать мудрые мысли о полиморфизме. И если Вы перегрузите виртуальный деструктор, то можете быть уверены, что каким бы ни был объект, но покидая комнату он уберёт за собой именно то, что ему свойственно было накакать.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
09.02.2016, 21:17
Цитата Сообщение от cyber-satyr Посмотреть сообщение
Обобщенных, означает то что она/он существует в единственном экземпляре в исходном тексте программы, но применяется к любым типам, для которых определены операции, описанные в теле полиморфной функции/метода.
Это параметрический полиморфизм.

Цитата Сообщение от cyber-satyr Посмотреть сообщение
(точнее псевдополиморфизм)
Почему псевдо? Что это значит?
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
09.02.2016, 22:51
Цитата Сообщение от ct0r Посмотреть сообщение
Почему псевдо?
Это, если угодно, речевой оборот. Потому что изначально был ad hoc, потом Степанов накостылил параметрик, а сейчас вместе с выводом типов не пойми что и как.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2016, 22:51
Помогаю со студенческими работами здесь

Зачем нужен static
Объясните зачем нужно объявлять перменные за типом статик, что это даёт я так и не понял. Почему объявлять нужно в классе, а потом ещё и за...

Зачем нужен return?
Я читал,что return возвращает значение функции. Какое значение? Почему иногда return 0, а иногда return 1? Бывают случаи,когда у return...

Зачем нужен символ \r?
Обычно его пишут вместе с \n, то есть так \r\n, а зачем? Ведь если просто написать \n тоже получаем перевод на новую строку

Зачем нужен extern?
Знаю, что в интернете полно объяснений зачем он, но я не могу понять... Везде пишут, что он &quot;позволяет объявить переменную без её...

Зачем нужен const?
Добрый вечер, разбираюсь с классом стек, подскажите пожалуйста, для чего здесь нужен const? bool IsEmpty() const { return...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru