Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
mh-coder
30 / 28 / 4
Регистрация: 01.02.2014
Сообщений: 830
#1

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

09.02.2016, 13:39. Просмотров 744. Ответов 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;
примеры везде на один мотив.

Теперь главный вопрос который не дает мне покоя, а с какого это перепоя мне вдруг понадобится указателю с одним типом, присваивать данные друго-го типа???!!!!
http://www.cyberforum.ru/cpp-beginners/thread215223.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2016, 13:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Зачем нужен полиморфизм (C++):

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

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

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

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

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

17
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
09.02.2016, 13:53 #2
Ну, например, у вас есть абстрактный класс Фигура и несколько конкретных ее наследников - различных фигур. Пусть вы хотите написать функцию, выводящую на экран объект любой из этих фигур. Какой параметр должен быть у функции? Правильно, указатель или ссылка на базовый класс Фигура.
0
mh-coder
30 / 28 / 4
Регистрация: 01.02.2014
Сообщений: 830
09.02.2016, 15:49  [ТС] #3
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, например, у вас есть абстрактный класс Фигура и несколько конкретных ее наследников - различных фигур. Пусть вы хотите написать функцию, выводящую на экран объект любой из этих фигур. Какой параметр должен быть у функции? Правильно, указатель или ссылка на базовый класс Фигура.
а можно пример, я ничнго не понял..
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
09.02.2016, 15:59 #4
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_
489 / 371 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
09.02.2016, 16:00 #5
Цитата Сообщение от mh-coder Посмотреть сообщение
а можно пример, я ничнго не понял..
думаешь ты поймешь пример?

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

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

не спорю, но есть одно но, я уже 2.5 года кодю на с++ при этом не считая года обчения, тоесть практики было достаточно, но я никогда не использовал модификатор virtual так как не понимал его смысла, чесно говоря мне и наследование никогда не приходилось использовать... хотя и проэкты я писал не маленькие... вообще не пониаю в каких случаях его(наследование) нужно использовать...
когда я пишу порграмму у меня есть основной класс с методами самой программы и дополнительные классы( типы )(для роботы с файлами, реестром и тп) которые наследовать основному классу нет смысла.
где подобному практиковатся?...
сейчас хочу устроится работать на фирму, наверника мне всё это понадобится, вот и решил уточнить зачем оно всё надо...
вы много нового узнаете: кто вы и что вам делать
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,179
Записей в блоге: 1
Завершенные тесты: 2
09.02.2016, 17:41 #8
Цитата Сообщение от 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
cyber-satyr
393 / 164 / 32
Регистрация: 10.12.2015
Сообщений: 717
09.02.2016, 17:44 #9
Цитата Сообщение от mh-coder Посмотреть сообщение
Теперь главный вопрос который не дает мне покоя, а с какого это перепоя мне вдруг понадобится указателю с одним типом, присваивать данные друго-го типа???!!!!
Этот вопрос вообще не имеет никакого отношения к полиморфизму. Как и полиморфизм к ООП. Полиморфизм суть абстракция для собздания обобщенных функций/методов. Обобщенных, означает то что она/он существует в единственном экземпляре в исходном тексте программы, но применяется к любым типам, для которых определены операции, описанные в теле полиморфной функции/метода.
Кликните здесь для просмотра всего текста
Подозреваю, но не знаю чтояно что Ъполиморфизм это единственный инстанс и после копиляции.
Полиморфизм (точнее псевдополиморфизм) в c++ реализован частично ядром языка, частично языком шаблонов.
1
mh-coder
30 / 28 / 4
Регистрация: 01.02.2014
Сообщений: 830
09.02.2016, 18:26  [ТС] #10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы много нового узнаете: кто вы и что вам делать
ну может вы тут мне разскажите кто я и что мне делать)) зачем плодить темы с подобными глупыми вопросами)
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
09.02.2016, 18:36 #11
mh-coder, вам рано еще на работу ити. Подумайте, что вы можете дать работодателю - сейчас мало кто заинтересован учить с нуля.

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

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

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

Не по теме:

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

0
Kastaneda
09.02.2016, 20:18
  #15

Не по теме:

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

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

Цитата Сообщение от cyber-satyr Посмотреть сообщение
(точнее псевдополиморфизм)
Почему псевдо? Что это значит?
0
cyber-satyr
393 / 164 / 32
Регистрация: 10.12.2015
Сообщений: 717
09.02.2016, 22:51 #18
Цитата Сообщение от ct0r Посмотреть сообщение
Почему псевдо?
Это, если угодно, речевой оборот. Потому что изначально был ad hoc, потом Степанов накостылил параметрик, а сейчас вместе с выводом типов не пойми что и как.
0
09.02.2016, 22:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2016, 22:51
Привет! Вот еще темы с решениями:

Зачем нужен malloc?
malloc - что это? И зачем оно нужно?

Зачем нужен dynamic_cast?
Point * mas; mas = new Point(); mas = new Square(); mas = new...

Зачем нужен конструктор?
Всем доброго дня. Ребят такая проблема объясните мне на пальцах для чего нужен...

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


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

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

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