Предлагаю к обсуждению один из краеугольных камней С++ - полиморфизм. А именно, предлагаю поговорить на тему виртуальных ф-ций, таблицы виртуальных ф-ций, множественного наследования, абстрактных классов и т.д., а так же все, что связано с этим понятием и конкретные реализации этой концепции в разных компиляторах.
В одной книженции читал что полиморфизм это когда одно имя функции, используется для разных значений, и показан пример что в Си для вычисления корня есть несколько функций: sqrt, fsqrt, а типа на плюсах можно одной. Вообщем бред полный, перепутать полиморфизм и перегрузку функций.
поли - много, морф- форма. Т.е. полиморфизм - многообразие форм! Перегрузка функций, операторов это инструмент с помощью которого можно достичь полиморфизма в некоторых случаях. Ладно это все теория, нафига оно надо на практике? Предположим, программист часто вызывает функцию расчета интерграла и он четко понимает, что есть разные типы! И что тип int это может по размеру и одинаково с float, но всеже разные вещи!!! Тут ему логично бы напивать две версии ф-ции Calc_Int(int arg) и Calc_Float(float arg), все вроде бы ок и вроде бы хорошо, все логично. Когда дела доходит до примения: result1 = Calc_Int(abc); result2 = Calc_Float(abc2); Это все нам привычно, однако возникает логичный вопрос: "А нельзя ли и для float и для int один интерфейс сделать?", иными словами Calc(abc) и Calc(abc2), это даст улучшение читабельности исходного кода. Где же еще можно его применить? А к примеру вы создали два экземпляра клacса Monser Monster1, Monser2. Возникла вдруг надобность в коде, что два монстра должны стать равными друг другу(сила, ловкость и др.) Че тогда делать? Ладно в int a = b; это просто, а как тут быть? Ответ прост: перегрузить для класса операцию присвоения, тогда объекты Monster1 = Monster2 можно будет также присваивать! ООП сила! Но чтобы это понять, мне пришлось долго плеваться, набить шишек, понять что я хочу упростить себе жизнь, и пересилить себя и почитать этого Гради Буча )))
Да забыл сказать, что мы все, т.е. все люди уже с рождения мыслят объектами ! И именно это мышление переложили на программирование, ед. минус в таких приложениях, это увилечение размера исполнимых файлов и становится менее эффективным код. Но в силу того щас не 386 а выше процы, и не 64мб ОЗУ а выше, а дальше все это будет расти развиваться еще, то стоит ли думать о том: "А почему такой большой файл?". Я считаю не надо, когда человеку предложат 1500 уе за работу, которую надо будет сделать. То сомневаюсь что он будет думать о размере файла, если это в задаче не критично ! Почему мы так мыслим? Наверно кто нить видел, как молодые мамы, бабушки показывают на окно внучку и приговаривают: "Это окошко ванюша", у ребенка в мозгу сразу происходит набор запоминаний: окно прозрачно(свойство), твердое(свойство), легко трескаемое(мама как-то отругала за то что разбил в зале), легко режущее( палец до сих пор заживает). У него сразу если чтото увидит прозрачно, твердое - то вероятно это окно! Чтобы вы сказали, если бы вам сказали, что у вашей мамы крылья выросли? Не поверили бы, уверяю вас, вы бы не поверили! Почему? Да потому что вы подумали бы Мама это человек, а человек никогда крыльев не имел! Вывод какой? Вы уже думаете объектами и их поведениями, их свойствами!
EvilsInterrupt Значит перегрузка, это тоже полиморфизм, круто. Но если полиморфизм - это просто много форм, тогда везде сплошной полиморфизм. Ведь везде сплошные формы, и их много.
Нет, полиморфизм и перегрузка, это действительно разные вещи. Что бы понять в чем заключается это различие, нужно смотреть на механизм реализации этих, совершенно разных, идей. Чуть позже я подробнее приведу свои мысли здесь на эту тему...
Booster Читай мой пост, а еще лучше, если конечно тебе мозгов хватит, читать Гради Буча и Страуструпа. Второй осознал что надо преподнести народу ООП, а Буч сумел это пояснить простыми словами! Что есть цель и что есть инструмент: 1) Получение прибыли это цель. А вот снижение себестоимости и затрат - это инструмент, с помощью которого достигается цель 2) Получение денег - цель. А вот написание программы - это инструмент, с помощью которого ты достигаешь цели. На нашем примере: Полиморфизм - это цель, а вот перегрузка это инструмент и никак иначе!
EvilsInterrupt Буча не читал, читал Страуструпа. Да мне и в принципе пофене как что называть, просто путаница всё это. Я привык считать что перегрузка - это перегрузка. Но если полиморфизм это чисто абстрактное понятие, означающее просто многообразие форм, то я и не против. Зачем тогда пишут в книгах, что оно вполне конкретное понятие, тоже не ясно.
Booster Когда ты пишешь программу ты не задумываешься как применить switch, потому что ты знаешь как он работает. Но узнал ты его, вероятно из книги. Пока ты читал книгу, тебе наверно попалось слово оператор и ты уже не думал, а что же такое слово "оператор"? Потому что кто-то когда то давным давно тебе пояснил его либо на словах, либо на пальцах, либо в литературе(прочитал книгу, статью, стихотворение )))). Вот этот самый "оператор" ты уже знаешь, поэтому ты можешь абстрагироваться и думать уже над switch, а не над словом "оператор" и его смыслом. Разве не так? Когда программисты разрабатывают ПО, для себя - это одно, лишь бы я понял! Когда на заказ, уже другое! Тут лишь бы я понял - не сработает! Что же хотят программисты когда пишут на заказ: -Написать быстро - чтобы деньги получить -Написать качественно - чтобы не падала и от юзера не было воплей -Написать понятный исх. код - чтобы в этом дерьме, можно было бы разобраться через год! ООП, я не говорю про полиморфизм в отдельности, он полностью покрывает эти 3 пункта! Почему? Потому что зная стандарт на предприятии, а на ООП его проще разработать, то программисты начинают как бы думать одинаково, следовательно продукт быстрее разрабатывается, поддерживается. Если написал код Ваня, то Олег тоже сможет разобраться в Ванинном коде, только потому что Ваня писал по стандарту конторы! ООП позволяет спасти проекты, путем того что все программисты отказываются от своих хочучек и привычек и пишут в единном стиле! Если следовать процедурному стилю программирования, то необходимо задуматься: "А какие задачи?", "Как задачи можно выполнить по отдельности?". Придет Санек, глянет код: "Такссс, тута Серый открыл файл, значит здесь я буду читать файл!", Пришел Валера глянул код Серого: "Так СЕрый тута открыл файл, Санька грамотно прочитал, щас я расчеты делать буду, мне нужна структура А, структура Б, структура С. Прямо рядом в этом месте и напишу, нафиг надо скролить лишний раз?". Пришел Серый в понедельник и сказал: "Раз уже саныч написал, пора уже закрыть файл" и так до бесконечности. А ООП-щик подумает не так, а так: "У меня должен быть Слон, тогда что он должен уметь?", "Может по мимо того что он махает хоботом, его летать научить?". Придет Ваня, глянет на код: "О Слон, значит он должен уметь махать хвостом", и он уже не полезет на форум и не спросит: "Помогите моему слону махнуть хвостом, пожалуйста, срочно!!!". А он четко знает, что слон просто обязан уметь "махать хоботом" и потому говорит: "Слон махни хоботом 3 раза"
EvilsInterrupt Ты собрался уговорить всех присутствующих на васме перейти на ООП? Топик ведь не о том, какой ООП замечательный стиль, а о полиморфизме...
Shimomochi Да фто вы гаварите. Перегрузка и шаблоны это статический полиморфизм. Сокрытие наследника за родителем - динамический полиморфизм. Статический "обретает форму" на этапе компиляции, динапический - на этапе выполнения. Будет очень интересно послушать эти самые мысли)) rmn А человек дело говорит, хоть и немного амбициозен
rmn Как ты будешь рассуждать о деньгах, если ты ни разу ниче некупил? Полиморфмизм прекрасен только в контексте ООП, остальные я даже не представляю.
EvilsInterrupt Есть уровни выше ООП, как насчёт их? Там ещё быстрее разрабатывать, ещё надёжнее, ещё проще.
Shimomochi Тогда давай уж сразу про COM говорить, там как раз и приходится обращать внимание на реализацию полиморфизма и виртуальных функций, а говорить только в контексте С++, мне кажется лишено практического смысла.
Code (Text): только в контексте С++, В точку! Не язык красит программиста, а программист язык! Это доказал нам Страуструп, показав, что не надо останавливаться на достигнутом. Были и есть новые задачи, которые можно и нужно решать! Зачем ездить на велосипеде в Москву, если есть Автомобили и более эффективные средства! IceStudent Не спорю, есть выше, но тема про полиморфизм! А полиморфизм это один из 3х китов, на которых держится ООП! Так что будем беседовать про Наследование, полиморфизм или инкапсуляцию. зы: Очень часто приходится видеть вопли: "Ассемблер крут, си отстой" или же "Си отстой, паскаль форева", основное назначение программера творить, а не выпендриваться! Одно дело слышать вопрос: "как вызвать MessageBoxA ?" и другое: "Язык А отстой, Язык Б круче". Скажите мне кто программист, тот кто спросил про MessageBoxA ? Или кто языки сравнивает?
rmn Первый - это и есть программист, только начинающий! А чтобы гуру не бесили обилие таких вопросов, прудумываю FAQ ))) Но все же это программист, потому что он стремится решать задачу, а не разглагольствовать!