Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/67: Рейтинг темы: голосов - 67, средняя оценка - 4.76
29 / 23 / 2
Регистрация: 14.04.2009
Сообщений: 448
1

Полиморфизм своими словами

02.06.2009, 14:04. Показов 13396. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дайте определения полиморфизма своими слова. А так же примерчик, который ярко выражает полиморфизм.
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2009, 14:04
Ответы с готовыми решениями:

Кто может своими словами объяснить нубу
Привет всем!!! Кому не трудно и не жалко своего времени, напишите, пожалуйста, что такое структура...

Как описать данный цикл своими словами ?
Подскажите пожалуйста как описать данный цикл своими словами: $x=$_POST; $y="неверно"; if...

Доказательство корректности алгоритма Краскаля "своими словами"
Хочу придумать доказательство корректности данного алгоритма но своими словами. Ведь на интуитивном...

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

36
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2013, 13:43 21
Author24 — интернет-сервис помощи студентам
programina, что-то интерфейса-то у Вас и нет.
Хотя бы такого:
C++
1
2
3
4
5
class sphere
{
public:
    virtual int getRadius() = 0;
};
Да и классы ничем не отличаются кроме имени.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:01 22
Цитата Сообщение от Tulosba Посмотреть сообщение
programina, что-то интерфейса-то у Вас и нет.
Хотя бы такого:
C++
1
2
3
4
5
class sphere
{
public:
    virtual int getRadius() = 0;
};
Да и классы ничем не отличаются кроме имени.
Зачем?
Здесь getRadius() и есть тот самый единый интерфейс.

Добавлено через 1 минуту
Про RTTI ничего не сказано.

Добавлено через 2 минуты
Ой!

Добавлено через 3 минуты
Про наследование ничего не сказано
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2013, 14:14 23
Цитата Сообщение от programina Посмотреть сообщение
Зачем?
Затем чтобы можно было использовать разнотипные объекты, реализующие интерфейс. В Вашем, например, случае нельзя SUN и EARTH добавить в единый контейнер (не прибегая к каким-нибудь хакам с void*).
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
#include <iostream>
 
using namespace std;
 
 
class sphere
{
public:
    virtual int getRadius() = 0;
};
 
class Sun : public sphere
{
public:
    int getRadius() { return 1000; }
};
 
class Earth : public sphere
{
public:
    int getRadius() { return 1; }
};
 
int main() {
 
    
    sphere* sp[] = { new Sun(), new Earth() };
    
    for( int i=0; i<sizeof(sp)/sizeof(*sp); ++i )
    {
        cout << sp[i]->getRadius() << endl;
        
    }
    return 0;
}
https://ideone.com/Ah4jfV

Пример кривоват, но суть показывает.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
06.05.2013, 14:20 24
Лучший ответ Сообщение было отмечено как решение

Решение

Tulosba, Это динамический полиморфизм, да.
Есть так же статический

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
#include <iostream>
 
template<typename Strategy>
struct Interface
{
public:
   void call()
   {
      Strategy().call();
   }
};
 
struct Flyable
{
public:
   void call()
   {
      std::cout << "flyable" << std::endl;
   }
};
 
struct Reachable
{
public:
   void call()
   {
      std::cout << "reachable" << std::endl;
   }
};
 
int main()
{
   Interface<Flyable>().call();
   Interface<Reachable>().call();
}
http://ideone.com/VbaSoY
4
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2013, 14:25 25
Цитата Сообщение от ForEveR Посмотреть сообщение
Есть так же статический
Согласен.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:25 26
ForEveR, struct это тот же class, только c public-внутреннестями?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2013, 14:26 27
Цитата Сообщение от programina Посмотреть сообщение
struct это тот же class, только c public-внутреннестями?
да. Так что можно было упростить и не только внутренностями. При наследовании тоже по умолчанию используется public.
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:31 28
Цитата Сообщение от Tulosba Посмотреть сообщение
да. Так что можно было упростить и не только внутренностями. При наследовании тоже по умолчанию используется public.
То есть public можно убрать из примера Forever ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
06.05.2013, 14:32 29
programina, Можно. А это столь критично?)
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:37 30
для меня все критично потому что я ООП учу
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
06.05.2013, 14:39 31
Цитата Сообщение от _SOKOL_ Посмотреть сообщение
Перегрузка - это функции с одним именем которые принимают разные аргументы, это никак не полиморфизм, тут спорить не о чем.
Тут упомянули про статический полиморфизм и привели пример с шаблонами (т.е. определение реализации на основании типа шаблонного аргумента). Так вот, перегрузка - это тоже статический полиморфизм, и спорить тут действительно не о чем, потому что это тоже полиморфизм. "Интерфейсом" в данном случае выступает не совокупность методов, имеющих разные реализации, а совокупность имён методов или функций, имеющих разные наборы или типы формальных параметров (и, соответственно, реализации). Т.е. если в динамическом полиморфизме вы вызываете метод и не задумываетесь, какая реализация будет вызвана, то в статическом полиморфизме вы изначально не задумываетесь, что это за метод/функция, достаточно помнить единое имя и какой интерфейс она имеет (какие параметры принимает).
1
1 / 1 / 0
Регистрация: 09.02.2013
Сообщений: 15
06.05.2013, 15:15 32
Цитата Сообщение от silent_1991 Посмотреть сообщение
Тут упомянули про статический полиморфизм и привели пример с шаблонами (т.е. определение реализации на основании типа шаблонного аргумента). Так вот, перегрузка - это тоже статический полиморфизм, и спорить тут действительно не о чем, потому что это тоже полиморфизм. "Интерфейсом" в данном случае выступает не совокупность методов, имеющих разные реализации, а совокупность имён методов или функций, имеющих разные наборы или типы формальных параметров (и, соответственно, реализации). Т.е. если в динамическом полиморфизме вы вызываете метод и не задумываетесь, какая реализация будет вызвана, то в статическом полиморфизме вы изначально не задумываетесь, что это за метод/функция, достаточно помнить единое имя и какой интерфейс она имеет (какие параметры принимает).
Перегрузка - это перегрузка.
Полиморфизм - это полиморфизм.
Эти два слова никак не синонимы, и даже не похожи по значению. Полиморфизм не может быть статическим или динамическим, это просто полиморфизм. Я конечно не профи с++, но такое вообще впервые слышу и даже не логично, ведь полиморфизм это часть ООП, а перегрузка может использоваться везде.
Когда кто-то говорит слово полиморфизм, лично у меня мысли только о методах с одним именем и разными реализациями.
Я считаю что это бред начинать предавать какие-то левые значения этим двум понятиям.
Ты говорил про примеры с шаблонами, но какая разница что шаблон или нет, полиморфизм выглядит одинаково везде.

Перегрузка выглядит так и только так:
C++
1
2
void show(char str[]) { cout << str; }
void show(int value) { cout << value; }
Я не вижу тут никаких полиморфизмов.

Если я не правильно понимаю, то наведи мне пример.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 15:22 33
_SOKOL_, полиморфизм - это развитие перегрузки в ООП
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
06.05.2013, 15:38 34
_SOKOL_,
Полиморфизм не может быть статическим или динамическим, это просто полиморфизм.
http://stackoverflow.com/quest... phism-in-c шикарный ответ, доказывающий обратное.
1
1 / 1 / 0
Регистрация: 09.02.2013
Сообщений: 15
10.05.2013, 12:34 35
Цитата Сообщение от ForEveR Посмотреть сообщение
_SOKOL_,
http://stackoverflow.com/quest... phism-in-c шикарный ответ, доказывающий обратное.
http://ru.wikipedia.org/wiki/C... 0.B7.D0.BC

Английский понимаю, но лень читать было, вот на русском.

Сегодня решил разузнать о полиморфизме. Получается я уже пользовался статическим и динамическим, но всё равно буду пожизненно отрицать что перегрузка функций это частичный случай полиморфизма, никак не может быть перегрузка даже похожей на полиморфизм.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
10.05.2013, 12:59 36
Цитата Сообщение от _SOKOL_ Посмотреть сообщение
буду пожизненно отрицать что перегрузка функций это частичный случай полиморфизма
Ага, осталось только отринуть истинность теоремы Пифагора - и в путь.
Цитата Сообщение от _SOKOL_ Посмотреть сообщение
не написано там что это полиморфизм
Где "там"? В убогой статье по плюсам в русской вики, ссылку на которую вы привели? Да, там не говорится. Но довольно странно изучать термин по статье, написанной по конкретному языку программирования. Например, в (достаточно посредственной) статье по полиморфизму, на которую есть ссылка и в разделе "Полиморфизм" приведённой вами статьи, говорится о том, что перегрузка - тоже полиморфизм. Правда, начальное определение термина в статье отбивает всё желание читать её дальше, поскольку складывается впечатление, что автор в своей жизни читал только "С++ для чайников", откуда и почерпнул данное определение.
Цитата Сообщение от _SOKOL_ Посмотреть сообщение
Сегодня решил разузнать о полиморфизме.
Не думаю, что правильно утолять свою жажду знаний посредством статей из русской вики, там встречаются ошибки и неточности, которые зачастую сокрыты за заумно и витиевато написанным текстом.

Не по теме:

Хм, интересно, а слово "витиевато" не делает мой пост витиевато написанным?..

0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
10.05.2013, 23:58 37
Оговоюсь сразу, что С++ знаю очень поверхностно и рискую высказаться, т.к. сам не уверен в том, что правильно понимаю вопрос. Полиморфизм, это конечно "один интерфейс - много методов", но как указывают многие авторы, нет возможностей ООП, воплощённых в виде классов, которые нельзя было бы реализовать в модульном, процедурном коде.
μορφή — форма, то есть полиморфизм - способность менять форму.
Мои наблюдения говорят о том, что полиморфизм в С++, реализуется за счет полиморфизма, заложенного в природу указателя как такового, и/или за счёт возможности контроля типов во время выполнения. При этом выяснение фактического типа, позволяет выяснить поведение кода, без явного применения логических операторов и операторов ветвления в точке изменчивости.
Можно изменить поведение кода, явно применив логическую операцию к значению переменной:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main(){
int a=1, b=1;
cout<<"enter a ";cin>>a;
if(a!=b)goto two;
one:
cout<<"one\n";system("pause");exit(0);
two:
cout<<"two\n"; 
system("pause");
return 0;   
}
Однако требуется явное применения операторов ветвления.
Возможность создавать сложные пользовательские типы, позволяет ветвить код не применяя такие операторы явно, но при этом тип используется как переменная для принятия решения:
C++
1
2
3
4
5
6
7
class Abase a{/**/};
class inhAb  b:Abase{/**/};
class inhAc  c:Abase{/**/};
//где-то в коде, тем не менее, логически предопределено, как проинициализируется указатель базового класса:
Abase *a=inhAb();
//или
Abase *a=inhAс();
Зато далее, достаточно сложная, различная логика, реализуемая наследниками никак не отразится в коде. Можно создавать коллекции базового типа, смешивая в них экземпляры наследников и итерировать указателем на базовый класс, вызывая лексически одни и те же методы.
Перегрузка функций, за счёт применения разнотипных аргументов, может вызывать изменчивость, проявляемую на стадии выполнения в точке вызова. При этом, переадресация происходит за счёт использования того или иного значения указателя на функцию, в зависимости от типов аргументов. То есть идея та же, вроде.
Я рискну сказать, что полиморфизм это способность программы изменять поведения в зависимости от того, на что конкретно указывает определённый указатель во время выполнения. Тем не менее, отсутствие опыта не даёт мне примеров, когда сама инициализация такого указателя не задана явной логикой.
Напоследок шутка, демонстрирующая факт, что указатель на тип не является законченным типом и поведение кода зависит от того, на что он в действительности указывает.
"Чары С" в С++:
C++
1
2
3
4
5
6
7
8
char a='a';
char* pa=&a;//указатель на char
char* pb="abcdef";//и это указатель на char
cout<<*pa<<endl;//а
cout<<*pb<<endl;//а
if(*pa==*pb)cout<<"*pa = *pb"<<endl;//эта операция определена для char
//cout<<pa<<endl;//не определено для любого указателя на char
cout<<pb<<endl;//нормально для указателя на С-строку
Не бесспорное резюме. Полиморфизм, это возможность кода менять поведение, без явного применения операторов ветвления в данной точке. Баги, тоже подходят под это определение.
Под классическое тоже, - наиболее эффективные, реализуют один и тот же интерфейс, что и правильный код.
0
10.05.2013, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2013, 23:58
Помогаю со студенческими работами здесь

Удалить пробелы, стоящие между первым и вторым словами, а также между двумя последними словами
Задание: Удалить пробелы, стоящие между первым и вторым словами, а также между двумя последними...

Дана строка текста, между словами текста минимум один пробел.Написать программу, которая между словами текста ставит по три точки!!
Дана строка текста, между словами текста минимум один пробел.Написать программу, которая между...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru