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

Полиморфизм своими словами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.81
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
02.06.2009, 14:04     Полиморфизм своими словами #1
Дайте определения полиморфизма своими слова. А так же примерчик, который ярко выражает полиморфизм.
Спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 14:04     Полиморфизм своими словами
Посмотрите здесь:

C++ Полиморфизм
C++ полиморфизм
C++ Полиморфизм
Полиморфизм C++
C++ Полиморфизм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.05.2013, 13:43     Полиморфизм своими словами #21
programina, что-то интерфейса-то у Вас и нет.
Хотя бы такого:
C++
1
2
3
4
5
class sphere
{
public:
    virtual int getRadius() = 0;
};
Да и классы ничем не отличаются кроме имени.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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 минуты
Про наследование ничего не сказано
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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

Пример кривоват, но суть показывает.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
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
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.05.2013, 14:25     Полиморфизм своими словами #25
Цитата Сообщение от ForEveR Посмотреть сообщение
Есть так же статический
Согласен.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:25     Полиморфизм своими словами #26
ForEveR, struct это тот же class, только c public-внутреннестями?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.05.2013, 14:26     Полиморфизм своими словами #27
Цитата Сообщение от programina Посмотреть сообщение
struct это тот же class, только c public-внутреннестями?
да. Так что можно было упростить и не только внутренностями. При наследовании тоже по умолчанию используется public.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:31     Полиморфизм своими словами #28
Цитата Сообщение от Tulosba Посмотреть сообщение
да. Так что можно было упростить и не только внутренностями. При наследовании тоже по умолчанию используется public.
То есть public можно убрать из примера Forever ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 14:32     Полиморфизм своими словами #29
programina, Можно. А это столь критично?)
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:37     Полиморфизм своими словами #30
для меня все критично потому что я ООП учу
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.05.2013, 14:39     Полиморфизм своими словами #31
Цитата Сообщение от _SOKOL_ Посмотреть сообщение
Перегрузка - это функции с одним именем которые принимают разные аргументы, это никак не полиморфизм, тут спорить не о чем.
Тут упомянули про статический полиморфизм и привели пример с шаблонами (т.е. определение реализации на основании типа шаблонного аргумента). Так вот, перегрузка - это тоже статический полиморфизм, и спорить тут действительно не о чем, потому что это тоже полиморфизм. "Интерфейсом" в данном случае выступает не совокупность методов, имеющих разные реализации, а совокупность имён методов или функций, имеющих разные наборы или типы формальных параметров (и, соответственно, реализации). Т.е. если в динамическом полиморфизме вы вызываете метод и не задумываетесь, какая реализация будет вызвана, то в статическом полиморфизме вы изначально не задумываетесь, что это за метод/функция, достаточно помнить единое имя и какой интерфейс она имеет (какие параметры принимает).
_SOKOL_
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; }
Я не вижу тут никаких полиморфизмов.

Если я не правильно понимаю, то наведи мне пример.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 15:22     Полиморфизм своими словами #33
_SOKOL_, полиморфизм - это развитие перегрузки в ООП
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 15:38     Полиморфизм своими словами #34
_SOKOL_,
Полиморфизм не может быть статическим или динамическим, это просто полиморфизм.
http://stackoverflow.com/questions/5...ymorphism-in-c шикарный ответ, доказывающий обратное.
_SOKOL_
1 / 1 / 0
Регистрация: 09.02.2013
Сообщений: 15
10.05.2013, 12:34     Полиморфизм своими словами #35
Цитата Сообщение от ForEveR Посмотреть сообщение
_SOKOL_,
http://stackoverflow.com/questions/5...ymorphism-in-c шикарный ответ, доказывающий обратное.
http://ru.wikipedia.org/wiki/C%2B%2B...B8.D0.B7.D0.BC

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 23:58     Полиморфизм своими словами
Еще ссылки по теме:

C++ Полиморфизм
Полиморфизм C++
C++ Полиморфизм в с++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
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;//нормально для указателя на С-строку
Не бесспорное резюме. Полиморфизм, это возможность кода менять поведение, без явного применения операторов ветвления в данной точке. Баги, тоже подходят под это определение.
Под классическое тоже, - наиболее эффективные, реализуют один и тот же интерфейс, что и правильный код.
Yandex
Объявления
10.05.2013, 23:58     Полиморфизм своими словами
Ответ Создать тему
Опции темы

Текущее время: 12:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru