Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Раннее и позднее связывание

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

Для этого, сравним два подхода к покупке какого-либо товара, к примеру, килограмма картофеля.

  1. Первый случай. Мы заранее знаем, что нам надо купить один килограмм картофеля. Поэтому, идя на "ПРИВОЗ", мы берем сумку и достаточное количество денег (так чтобы хватило на покупку одного килограмма).

  2. Второй случай. Выходя из дома, мы еще не знаем что и как много нам надо купить. Поэтому мы берем большущую сумку (на всякий случай) и как можно больше денег. Едем на рынок и только там выясняем, что надо купить всего-то один килограмм картофеля.

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

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

А теперь интересное... Рассмотрим этот пример с точки зрения программирования. При применении раннего связывания, происходит следующая ситуация: мы сообщаем компилятору чего ему делать и указываем, что все вызовы функций должны быть статически (жестко) связаны. Таким образом, связывание сообщения, посылаемого объекту, с конкретной функцией-членом осуществляется на этапе компиляции, то есть до запуска программы. Такое раннее связывание во многих случаях желательно, так как это позволяет получать наиболее оптимальный код. Плюс ко всему, кроме раннего связывания компилятор С++ выполняет проверку типа, гарантируя, что каждому объекту посланно законное сообщение. В действительности, наш любимый язык С++ предлагает нам выбор между проверкой типов и поздним связыванием.

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

Позднее связывание позволяет связать сообщение с методом во время выполнения программы. Благодаря этому, программист, использующий С++, может применять огромную гибкость при написании программного обеспечения. Программист определяет специфические действия, которые должен выполнить объект, получив сообщение. Во время выполнения программа интерпретирует эти действия и связывает сообщение с соответсвующим методом. Просмотр списка методов и выбора нужного возлагается не на программиста, а на программу. Это позволяет писать более надежный код и облегчает его использование и модификацю.

Вполне естественно, что скорость и эффективность при раннем связывании выше, чем при использовании позднего связывания. Тем не менее, благодаря позднему связыванию возможно добиться некоторой универсальности связывания.