Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2012, 16:04   #1
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию Полиморфизм.

Доброго времени суток!
Хочу разобраться с тремя китами ООП - Инкапсуляция, Наследование, Полиморфизм.
С двумя разобрался, а вот третий - полиморфизм не могу понять.. зачем он надо и что это такое вообще..

Может кто-то подробно, желательно с примерами объяснить что такое полиморфизм ?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 18.07.2012, 16:12   #2
blacktener
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 78
По умолчанию

вот каноничный пример:
все утки крякают, но все крякают по разному.
вот так это выглядит:
Код:
class Duck {
public:
	virtual void quack() {}
};

class MallardDuck : public Duck {
public:
	virtual void quack() {
		cout << "quack quack" << endl;
	}
};

class RussianDuck : public Duck {
public:
	virtual void quack() {
		cout << "QUACK!!!" << endl;
	}
};

int main() {
	Duck *duck1, *duck2;
	duck1 = new MallardDuck();
	duck2 = new RussianDuck();
	duck1->quack();
	duck2->quack();
	return 0;
}
хотя чтобы понять в чем суть полиморфизма нужно просто программить. со временем сам поймешь
blacktener вне форума Ответить с цитированием
Старый 18.07.2012, 17:01   #3
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

вроде понятно, но не очень..
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 18.07.2012, 17:13   #4
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от asmars Посмотреть сообщение
вроде понятно, но не очень..
Подробнее, милейший, не стесняйтесь!
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 18.07.2012, 17:20   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

один из примеров что мне нравиться это классы TStream в Delphi/C++ Builder.
ибо он абстрактный и дает единый интерфейс для чтения/записи потоковых данных.
а реализации уже это
TFileStream -> класс для файлов.
TMemoryStream -> класс для работы с потоком в памяти.
TStringStream -> класс для работы со строкой(она в памяти естественно)
TSocketStream -> класс для работы с сокетами.
TZlibCompressionStream/TZlibDecompressionStream -> класс для сжатия/расжатия данных на лету в другой поток(из другого потока)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2012, 17:24   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Last Посмотреть сообщение
Подробнее, милейший, не стесняйтесь!
Полиморфизм - закрытость. Если вы пишете свой класс, Вы можете скрыть от пользователя класса некоторые переменные. Это даёт возможность зделать класс переносимым на разные платформы.
В некотором смысле, инкапсуляция позволяет это зделать, но полиморфизм, имеет более широкое понятие в реализации.
В частности в том, что позволяет назначать функции (процедуре), с одноимённым названием, разные параметры.
Напимер:
Код:
int MyFunction(int a, int b)
{

}

void MyFunction(int a, int b)
{

}

int MyFunction(double a, double b)
{

}
Две функции и одна полиморфическая процедура.
Угадай, где процедура?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Чел и так нуб, а тут такие заморочки. Это мне такие вещи можно рассказывать, я не обижусь .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 18.07.2012 в 17:34.
Smitt&Wesson вне форума Ответить с цитированием
Старый 18.07.2012, 17:38   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Smitt&Wesson

Полиморфизм - закрытость. Если вы пишете свой класс, Вы можете скрыть от пользователя класса некоторые переменные. Это даёт возможность зделать класс переносимым на разные платформы.

А теперь - правильный ответ :D

полиморфизм не имеет ни малейшего отношения ни к "закрытости" чего бы то ни было, ни к вопросам переносимости кода на другие платформы.

Главная его "фишка" - это возможность единообразного взаимодействия с разнородными по сути объектами.

Угадай, где процедура?

Нигде. В C/C++ нет процедур. Забыли, видимо, добавить ):

полиморфическая процедура.

а это ЭТО такое не знаю даже я :lol:

Последний раз редактировалось Stilet; 18.07.2012 в 20:07.
Rififi вне форума Ответить с цитированием
Старый 18.07.2012, 17:42   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Smitt&WessonГлавная его "фишка" - это возможность единообразного взаимодействия с разнородными по сути объектами.
Те-же яйца, только в профиль.

Цитата:
Сообщение от Rififi Посмотреть сообщение
Угадай, где процедура?

Нигде. В C/C++ нет процедур. Забыли, видимо, добавить ):

полиморфическая процедура.

а это ЭТО такое не знаю даже я :lol:
Упс. Не забыли. Процедура не возвращает значений, а функция - возвращает. Не берём возвращаемые значения через указатели.
В C++, просто понятие процедуры не определено, но существует (как ни странно).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Stilet; 18.07.2012 в 20:18.
Smitt&Wesson вне форума Ответить с цитированием
Старый 18.07.2012, 17:46   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Полиморфизм - закрытость.
ложь.
полиморфизм ближе к гибкости.
Цитата:
Вы можете скрыть от пользователя класса некоторые переменные. Это даёт возможность зделать класс переносимым на разные платформы.
это инкапсуляция.
а еще есть pimpl.
Цитата:
В частности в том, что позволяет назначать функции (процедуре), с одноимённым названием, разные параметры.
это перегрузка и не имеет отношения к ООП.
Код:
int MyFunction(int a, int b)
{

}

void MyFunction(int a, int b)
{

}
а оно не скомпилиться.
ибо по возвращаемому типу нет отличия, так же как и в Делфи.
потому в С++ и не делают разницы между функцией и процедуры.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 18.07.2012 в 17:54.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2012, 17:55   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ложь.
полиморфизм ближе к гибкости.
это инкапсуляция.
а еще есть pimpl.
это перегрузка и не имеет отношения к ООП.
Имеет, имеет. Полиморфизм, возможность использовать виртуальные функции, используя сигналы любой операционной системы при помощи указателей.
Многие операционные системы, являются полиморфными. Почти ничего не "зная" о задачах, которые эти сообщения посылают, умеют на них реагировать.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полиморфизм Anubys Помощь студентам 1 26.12.2011 20:42
Полиморфизм Zorgan Visual C++ 22 29.08.2011 12:23
Полиморфизм MasterSporta Общие вопросы C/C++ 3 10.04.2011 23:46
полиморфизм slayerblya Общие вопросы C/C++ 1 27.02.2011 01:43
Полиморфизм mister2010 Общие вопросы C/C++ 30 24.05.2010 01:07