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

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

09.02.2016, 13:39. Показов 2877. Ответов 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
9006 / 4707 / 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru