Отправляет email-рассылки с помощью сервиса Sendsay

Инвестирование с нуля

  Все выпуски  

Программирование на Си и С++ с нуля 170) Полиморфизм и способы связывания


Школа программирования

170) Программирование на С++: полиморфизм и способы связывания

Мне довольно часто пишут письма, в которых спрашивают: а как научиться этому, а как научиться тому, а как записывается такой оператор, а что такое объекты, а как создавать приложения, работающие с базами данных, и вообще, что это такое, а как разрабатывать программы для интернета, а что такое язык моделирования UML... Пробовал по вашему курсу заниматься, но трудновато самому...
Этому вроде на курсах учат, но там дорого...

Действительно, есть немало (хотя и не очень много) вещей, которые программисту, айтишнику, надо знать.

Как-то так:

Знаете Си++ - требуйте добавления 100 долларов к зарплате :).
Знаете SQL - требуйте добавления 200 долларов к зарплате :).
Знаете, как запрограммировать взаимодействие приложения с СУБД - требуйте добавления 300 долларов к зарплате :).
Знаете C# и .NET - требуйте добавления 400 долларов к зарплате :).
Знаете UML и шаблоны проектирования - требуйте добавления 500 долларов к зарплате :).
Знаете, что такое программная инженерия, совместная работа над исходными текстами, версионный контроль, управление требованиями - требуйте добавления 1000 долларов к зарплате :).

А узнать эти все вещи просто - просто купите один из моих учебных курсов (или все сразу :).

Не хотите мой, - ну купите учебный курс другого автора :)
Правда, тогда, придется покупать не одну книжку, а несколько, но это вопрос личного выбора.

Но сделайте это! Чего жалеть триста рублей на личное развитие? Это глупо. Это две несъеденные курицы (пусть лучше они живут :), это пустая болтовня по мобильному, это дешевая китайская кофточка, которая развалится под первым дождем...
В конце концов, купите полезную книгу просто так, не преследуя никакой цели - вам обязательно воздастся! :-)

Но здесь важно именно потратить некоторую сумму - таким образом создатся хоть и небольшая, но все же действенная мотивация к изучению. А из Сети можно накачать кучу самоучителей, однако у многих наверняка на винчестерах уже накоплены огромные библиотеки электронных книг - и что толку? Весь Интернет забит полезной информацией, но ей как пользовался один процент людей, способных для себя самих создавать правильную мотивацию, так и пользуется. Число хороших специалистов не увеличилось, скорее наоборот :)
Отдача от электронных книг минимальна. Как справочные пособия они хороши, но читать и тем более изучать что-то серьезное с экрана - неудобно и неприятно.

За компьютером программировать, кстати, занимательно, а вот читать учебные тексты - нет. Другие механизмы восприятия работают при создании электронного продукта и при "потреблении" текстов. Потому и заниматься по данному курсу смысл имеет в интерактивном режиме - пиша :) письма и получая обратную связь и некоторое "подталкивание". А просто читать и изучить тексты с экрана малоэффективно.

Книга должна быть БУМАЖНОЙ :) , материальной, ее надо держать в руках, ощущая тяжеленький вес, перелистывая страницы, лежа при этом на диване или сидя в удобном кресле...

Книги - это Ваши знания, которые будут с вами всегда! Знания и умения, в отличие от всего остального, отнять у человека невозможно.

Освоение этих вещей, этих технологий несложно! Они кажутся сложными только потому, что состоят из большого числа "кирпичиков", которые запомнить трудно. Но схема, модель, общая структура всегда одна, меняется лишь форма, способ реализации. Чтобы научиться ездить на велосипеде, надо потренироваться - кому-то час, кому-то месяц. Но эта тренировка делается в жизни всего один раз, а навык остается навсегда.

Помните наш лозунг - цитату Бэндлера?

Только подумайте: какие-то придурки могут играть на гитаре.
Чем вы хуже? Подумайте об этом - я серьезно.
Сегодня вечером вы придете домой, включите телевизор и услышите:
"Как у вас родилась эта мелодия?"
А какой-нибудь тип ответит: "Не знаю. Родилась и все".

Посмотрите, есть ли в выбранной вами книге прикладные примеры, - если есть, смело покупайте. Выполните их и убедитесь, что все это пустяки. Получите практический опыт, который потом автоматически перенесется на другие технологии. Умеете работать с Interbase - почти так же работают и с Microsoft SQL Server и с другими СУБД.

Потом подойдите к начальнику, и расскажите, что вы умеете нового. Посмотрите вокруг у себя на работе, что можно улучшить, автоматизировать :) - и предложите.

Можно также сделать позитивное улучшение и самостоятельно, тайно :-)


Полиморфизм.

Под заковыристым словом "полиморфизм" на самом деле скрывается невинная и естественная способность программы выполнять методы объектов в точном соответствии с конкретным типом объекта. Например, метод "Ехать" объекта - экземпляра класса "Запорожец" наверняка отличается от метода "Ехать" объекта класса "Мерседес". Но при этом имена таких методов совпадают, что нередко и путает разработчиков.

Кроме того, язык С++ допускает хранение в переменной объектного типа (класса) реального объекта другого типа. Типы эти связаны некоторым образом по иерархии наследования. Например, возьмем из предыдущего занятия классы Car (Автомобиль) и Truck (Грузовик), наследник класса Car.

   class Car
       {
       public:
        double Benzin; // бензин

  void Go( float dist ) {
  Benzin -= dist / 10; // 1 литр бенза на 10 км
  Rasst += dist; // проехали
  }

  protected:
  double Rasst; // пройденное расстояние
  };

   class Truck : public Car
     {
     public:
  int Kuzov;

     void Go( float dist ) {
  Benzin -= dist / 5; // 1 литр бенза на 5 км
  Rasst += dist; // проехали
  }
     };

Стандартны следующие декларации объектов:

   Car * car = new Car;
   Truck * truck = new Truck;

Однако принцип полиморфизма допускает и такую запись:

   Car * car = new Truck;

Переменная ссылочного, более общего типа допускает хранение ссылки на дочерний тип.

А вот запись

   Truck * truck = new Car;

будет ошибочной. Однако можно принудительно выполнить подобный оператор, если явно указать приведение типов:

    Truck * truck = (Truck*)(new Car);

Здесь создается новый экземпляр класса Car, и ссылка на него приводится к типу ссылки на объект класса Truck.

В результате в переменных car и truck будут храниться ссылки на объекты других классов! Переменая car хранит ссылку на объект-грузовик, наследник Car, а переменная truck хранит ссылку на экземпляр родительского класса Car.

Теперь зададим вызовы метода Go(), который имеется и в классе Car, и в классе Truck:

   Car * car = new Truck;
   car->Go(100);

   Truck * truck = (Truck*)(new Car);
   truck->Go(100);

Какие конкретно версии метода Go() будут вызваны - класса Car или Truck? Это и определяет принцип полиморфизма. В соответствии с ним в языке С++ определены так называемые статическое связывание и динамическое связывание. Связывание - не людей :) , а методов с объектом.

Статическое связывание - это связывание метода с родительским объектом на этапе компиляции. Так как компилятор не знает, как конкретно будет работать программа, он всегда исходит из известного и явно заданного типа объекта-владельца метода. Если используется переменная car класса Car, то будет вызван метод Go() класса Car, хотя физически в переменной car хранится экземпляр класса Truck.
Так же и в случае с переменной truck - хотя мы принудительно записали в нее ссылку на объект класса Car, компилятор об этом не знает и исходит из типа переменной truck - вызывает метод Go() класса Truck.

При этом компилятор можно явно "обмануть" - выполнить приведение типов:

    ((Car*)truck)->Go(100);

Здесь уже будет вызван метод Go() класса Car, так как владелец метода Go() в левой части выражения явно приведен к типу Car.

Динамическое связывание - это связывание метода с объектом, которое происходит во время работы программы. При этом нужный метод определяется уже не типом переменной-владельца, а реальным типом объекта, ссылку на который она хранит. Но такое связывание возможно только для так называемых виртуальных методов, - разделение типов методов нужно, чтобы подсказать компилятору, где какое связывание реализовывать.

Виртуальный метод - это обычный метод, в заголовке которого используется ключевое слово virtual. Например:

   class Car
       {
       public:
  ...
 
  virtual void Go( float dist ) {
          ...
  }
  ...

Теперь метод Go() класса Car описан как виртуальный. Пусть имеются команды

   Truck * truck = (Truck*)(new Car);
   truck->Go(100);

Если бы метод Go() класса Car был невиртуальным, то выполнилось бы статическое связывание. Но в данном случае вызывается метод Go() класса Car, потому что переменная truck типа Truck хранит ссылку на экземпляр класса Car.


(c) 2004-2007 Сергей Бобровский : bo собака russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Мои книги (учебные курсы) "Технологии Delphi / C++ / C#. Разработка приложений для бизнеса".
http://shop.piter.com/display.phtml?a_id=17681&web_ok=all

Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией. Именно это мои книги и дают.
В учебных курсах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Delphi 2005/2006/2007 и Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.

Мои книги, которые пока доступны в продаже:


Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное